go的类型断言
0 简介
在 Go 中,一个接口(interface)是一组方法签名的集合。具体类型(struct 等)可以实现这些方法,从而满足接口的要求。通过这种方式,一个对象的类型可以被表示为一个或多个接口类型。
- 类型转换是基于接口实现的: 在进行类型转换时,被转换的对象必须是实现了目标类型所要求的接口的。如果对象并没有实现接口,转换将失败,并且在运行时会返回一个错误
- 类型转换必须是兼容的: 类型转换只能在源类型和目标类型之间存在相容关系时进行。即目标类型必须是源类型的一个接口,或者源类型可以直接转换为目标类型。
- 类型断言会返回两个值: 类型断言返回两个值,一个是实际转换后的值,另一个是指示转换是否成功的布尔值。
1 好处
众所周知,类型转换是很常见的东西。但是像C++、python,他们的类型转换,应该叫做强制转换,直接在类型上的转换。比如int -> float
,float -> int
,都是能成功的,但是float->int
是直接截断数字的,所以就会有问题
对于Go语言,类型转换是基于接口的,只有当 目标类型 实现了 源类型 的所有方法签名,这样的转换才是安全的。
简单的例子: 如果类型
A
和类型B
都实现了接口I
,那么你可以通过类型断言将类型A
转换为类型B
。但如果类型C
并不实现接口I
,那么将类型A
转换为类型C
是不合法的,会导致编译错误或运行时错误