目录
【1】初涉类型断言
由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。
如下代码:
将一个float32类型的 f 变量交给 空接口类型的 i 是可以的。 并且 i 的数据类型也变成了 float32
但是又定义了一个float32类型的 f2 并将 i 赋值给 f2 时却会报错。
解决方法:使用类型断言
我们直接断言 i 就是 float32 类型,如果真的是 float32 就会正常赋值,如果不是则会报错
报错情况:
在进行类型断言时,如果类型不匹配,就会报 pamic,因此进行类型断言时,要确保原来的空接口指向的就是断言的类型。
如何在进行断言时,带上检测机制,如果成功就 ok, 失败也不要报 panic?
【2】龟兔赛跑案例
如下代码进行了一场龟兔赛跑比赛,正常情况乌龟是跑不过兔子的,除非兔子中途睡觉。
所以在Running方法中进行了类型断言。如果是兔子类型的话就会调用Sleep方法。
package main
import "fmt"
//声明一个跑步接口,里面声明了开始和结束两个方法
type Run interface {
Start()
End()
}
type Rabbit struct {
Name string
}
func (r Rabbit) Start() {
fmt.Println(r.Name, "跑步开始")
}
func (r Rabbit) End() {
fmt.Println(r.Name, "跑步结束")
}
func (r Rabbit) Sleep() {
fmt.Println(r.Name, "睡觉了")
}
type Turtle struct {
Name string
}
func (t Turtle) Start() {
fmt.Println(t.Name, "跑步开始")
}
func (t Turtle) End() {
fmt.Println(t.Name, "跑步结束")
}
type Competition struct {
}
func (c Competition) Running(run Run) {
run.Start()
//如果是兔子则会睡觉
//使用类型断言
if rabbit, ok := run.(Rabbit); ok {
rabbit.Sleep()
} else {
run.End()
}
}
func main() {
var arr [3]Run
arr[0] = Rabbit{"兔子1号"}
arr[1] = Rabbit{"兔子2号"}
arr[2] = Turtle{"乌龟1号"}
var competition1 Competition
for _, v := range arr {
competition1.Running(v)
fmt.Println("---------------")
}
}
【3】循环判断参数类型
v.(type) 可以返回变量 v 的数据类型
package main
import "fmt"
type Student struct{}
func TypeJudge(items ...interface{}) {
for i, v := range items {
switch v.(type) { //(type)是固定写法
case bool:
fmt.Printf("第%v个参数是 bool 类型,值是%v\n", i, v)
case float32, float64:
fmt.Printf("第%v个参数是 float 类型,值是%v\n", i, v)
case int, int16, int32, int64:
fmt.Printf("第%v个参数是 整数整形,值是%v\n", i, v)
case string:
fmt.Printf("第%v个参数是 string 类型,值是%v\n", i, v)
case Student:
fmt.Printf("第%v个参数是 Student 类型,值是%v\n", i, v)
case *Student:
fmt.Printf("第%v个参数是 *Student 类型,值是%v\n", i, v)
default:
fmt.Printf("第%v个参数是 未知 类型,值是%v\n", i, v)
}
}
}
func main() {
a1 := 1.1
a2 := 40
a3 := "tom"
a4 := true
a5 := 3.4
var a6 [3]int
var a7 Student
TypeJudge(a1, a2, a3, a4, a5, a6, a7, &a7)
}