前景
因为空接口interface{}没有定义任何函数,因此Go中所有类型都实现了空接口。当一个函数的形参是interface{},那么在函数中,需要对形参进行断言,从而得到他的真实类型。
语法
//安全类型断言
<目标类型的值>,<布尔参数> := <表达式>.(目标类型)
//非安全类型断言
<目标类型的值> := <表达式>.(目标类型)
方式一:
1.instance := 接口对象.(实际类型) // 不安全,会panic()
2.instance,ok := 接口对象.(实际类型) //安全
方式二:
switch instance := 接口对象.(type){
case 实际类型1:
...
case 实际类型2:
...
}
package main
import (
"fmt"
"math"
)
func main(){
var t1 Triangle = Triangle{3,4,5}
//t1 := Triangle{3,4,5} 与上面一样的概念
fmt.Println("三角形的周长为:",t1.peri()) //三角形的周长为: 12
fmt.Println("三角形的面积为:",t1.area()) //三角形的面积为: 6
var c1 Circle = Circle{4}
fmt.Println("C1的周长为:",c1.peri()) //C1的周长为: 25.132741228718345
fmt.Println("c1的面积为:",c1.area()) //c1的面积为: 50.26548245743669
//声明接口
var s1 Shape
s1 = t1
fmt.Println(s1.peri()) //12
fmt.Println(s1.area()) //6
var s2 Shape
s2 =c1
fmt.Println(s2.peri()) //25.132741228718345
fmt.Println(s2.area()) //50.26548245743669
testShape(t1) //周长:12.00,面积:6.00
testShape(c1) //周长:25.13,面积:50.27
testShape(s1) //周长:12.00,面积:6.00
getType(t1) //是三角形,三边是: 3 4 5
getType(c1) //是圆形,半径是: 4
getType(s1) //是三角形,三边是: 3 4 5
var t2 *Triangle = &Triangle{3,4,2}
fmt.Printf("t2:%T,%p\n",t2,&t2) //t2:*main.Triangle,0xc000006030
getType(t2)//ins:*main.Triangle,0xc000006038 s:*main.Triangle,0xc00003c220
}
func getType(s Shape){
//断言
if ins,ok := s.(Triangle);ok{
fmt.Println("是三角形,三边是:",ins.a,ins.b,ins.c)
}else if ins,ok := s.(Circle);ok{
fmt.Println("是圆形,半径是:",ins.radius)
}else if ins,ok:= s.(*Triangle);ok{
fmt.Printf("ins:%T,%p\n",ins,&ins)
fmt.Printf("s:%T,%p\n",s,&s)
}else{
fmt.Println("我也不知道了")
}
}
func testShape(s Shape){
fmt.Printf("周长:%.2f,面积:%.2f\n",s.peri(),s.area())
}
//1.定义一个接口
type Shape interface{
peri() float64 //形状的周长
area() float64 //形状的面积
}
//2.定义实现类:三角形
type Triangle struct {
//a float64
//b float64
//c float64
a,b,c float64 //与注释掉的一样
}
func (t Triangle) peri() float64{
return t.a + t.b + t.c
}
func (t Triangle) area() float64{
p := t.peri() /2
s := math.Sqrt(p*(p-t.a)*(p-t.b)*(p-t.c))
return s
}
//3定义另一个实现类:圆形
type Circle struct{
radius float64
}
func (c Circle) peri() float64{
return c.radius *2 * math.Pi
}
func (c Circle) area() float64{
return math.Pow(c.radius,2)*math.Pi
}
网友评论