共计 1943 个字符,预计需要花费 5 分钟才能阅读完成。
咱们一起来回顾一下上一次说到的 interface{}
- 能够用来做多态
- 接口类型分为空接口类型和非空接口类型,他们的底层数据结构不太一样
这里顺便说一下,用来作态须要满足这样的条件:
- 首先得有父类指针指向子类的对象
- 这个接口还必须是非空接口,外面得蕴含办法,也就是应用的底层数据结构是 iface
- 子类会去实现父类的具体方法
interface{} 留神断言
失常的应用断言,写一个简略的 断言 demo
type Animal interface{} | |
func main() { | |
var a Animal = "xiaomotong" | |
v, ok := a.(string) | |
if !ok{fmt.Println("type error") | |
} | |
fmt.Println("v ==",v) | |
} |
断言留神写成 2 个返回值的,一个是具体的值,一个是 bool,判断断言是否胜利,若胜利则阐明断言正确,且 v 会被赋值为理论变量的值
切忌没头脑的强转
func main() { | |
var a Animal = "xiaomotong" | |
v := a.(int) | |
fmt.Println("v ==",v) | |
} |
上述这种写法,若不判断是否断言胜利,间接强转,程序是会 panic 的,执行上述程序后成果如下:
>go run main.go | |
panic: interface conversion: main.Animal is string, not int | |
goroutine 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 = "xiaomotong" | |
switch 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 = "xiaomotong" | |
v := reflect.ValueOf(a) | |
fmt.Printf("v type ==", v.Type(), "v ==", v.String()) | |
} |
执行上述代码后成果如下:
> go run main.go | |
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong) |
没故障失常获取,然而如果咱们这样写的话是不是也能够正确执行呢?
type Animal interface{} | |
func main() { | |
var a Animal = "xiaomotong" | |
v := reflect.ValueOf(a) | |
fmt.Printf("v type ==", v.Type(), "v ==", v.Int()) | |
} |
看这个例子也就和下面的例子相差在输入的时候,一个是v.String()
,一个是v.Int()
,可是后果却相差很大
go run main.go | |
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong) | |
D:\mycode\my_new_first\interface_test>go run main.go | |
panic: reflect: call of reflect.Value.Int on string Value | |
goroutine 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 提个醒
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 阿兵云原生,欢送点赞关注珍藏,下次见~
正文完