临夏州住房和城乡建设厅网站,海南网络推广评估,什么是网络营销最传统的手法,虚拟主机建多个网站我们一起来回顾一下上一次说到的 interface{} 可以用来做多态 接口类型分为空接口类型和非空接口类型#xff0c;他们的底层数据结构不太一样
这里顺便说一下#xff0c;用来作态需要满足这样的条件#xff1a;
首先得有父类指针指向子类的对象这个接口还必须是非空接口…我们一起来回顾一下上一次说到的 interface{} 可以用来做多态 接口类型分为空接口类型和非空接口类型他们的底层数据结构不太一样
这里顺便说一下用来作态需要满足这样的条件
首先得有父类指针指向子类的对象这个接口还必须是非空接口里面得包含方法也就是使用的底层数据结构是 iface子类会去实现父类的具体方法
interface{} 注意断言
正常的使用断言写一个简单的 断言 demo
type Animal interface{}func main() {var a Animal xiaomotongv, ok : a.(string)if !ok{fmt.Println(type error)}fmt.Println(v ,v)
}断言注意写成 2 个返回值的一个是具体的值一个是 bool判断断言是否成功若成功则说明断言正确且 v 会被赋值为实际变量的值
切忌没头脑的强转
func main() {var a Animal xiaomotongv : a.(int)fmt.Println(v ,v)
}上述这种写法若不判断是否断言成功直接强转程序是会 panic 的 执行上述程序后效果如下
go run main.go
panic: interface conversion: main.Animal is string, not intgoroutine 1 [running]:
main.main()D:/mycode/my_new_first/interface_test/main.go:13 0x4c
exit status 2
程序崩掉那就是线上问题了 xdm 这里需要注意
当然我们也可以这样写
type Animal interface{}func main() {var a Animal xiaomotongswitch a.(type) {case string:fmt.Println(a type is string)case int:fmt.Println(a type is int)}}通过 switch 的方式来判断 接口的数据类型根据不同的数据类型来做不同的事情进行分类处理
用于反射的注意点
golang 里面有反射这个概念简单来说咱们可以通过反射包来实现获取接口真实的类型和真实的数据
举个小例子
通过反射来获取 Animal 接口的数据类型和具体的数据值
type Animal interface{}func main() {var a Animal xiaomotongv : reflect.ValueOf(a)fmt.Printf(v type , v.Type(), v , v.String())
}执行上述代码后效果如下 go run main.go
v type %!(EXTRA *reflect.rtypestring, string v , stringxiaomotong)没毛病正常获取但是如果我们这样写的话是不是也可以正确执行呢
type Animal interface{}func main() {var a Animal xiaomotongv : reflect.ValueOf(a)fmt.Printf(v type , v.Type(), v , v.Int())
}看这个例子也就和上面的例子相差在输出的时候一个是v.String() 一个是v.Int() 可是结果却相差很大
go run main.go
v type %!(EXTRA *reflect.rtypestring, string v , stringxiaomotong)
D:\mycode\my_new_first\interface_testgo run main.go
panic: reflect: call of reflect.Value.Int on string Valuegoroutine 1 [running]:
reflect.Value.Int(...)C:/Program Files/Go/src/reflect/value.go:999
main.main()D:/mycode/my_new_first/interface_test/main.go:26 0x2bd
exit status 2
执行上述代码go 程序给我们报了 panic 错误这里需要注意 程序崩溃的原因是我们将一个 string 类型的值反射成一个 Int 类型的值直接在 反射包里面就给我们报了 panic
小知识大挑战简单的写 2 个注意事项给 xdm 提个醒
欢迎点赞关注收藏
朋友们你的支持和鼓励是我坚持分享提高质量的动力 好了本次就到这里
技术是开放的我们的心态更应是开放的。拥抱变化向阳而生努力向前行。
我是阿兵云原生欢迎点赞关注收藏下次见~