共计 1365 个字符,预计需要花费 4 分钟才能阅读完成。
序
本文次要钻研一下 golang 的类型断言
类型断言
x.(T)
- 断言 x 不为 nil 且 x 为 T 类型
- 如果 T 不是接口类型,则该断言 x 为 T 类型
- 如果 T 类接口类型,则该断言 x 实现了 T 接口
实例 1
func main() {var x interface{} = 7
i := x.(int)
fmt.Println(reflect.TypeOf(i))
j := x.(int32)
fmt.Println(j)
}
间接赋值的形式,如果断言为 true 则返回该类型的值,如果断言为 false 则产生 runtime panic;j 这里赋值间接 panic
输入
int
panic: interface conversion: interface {} is int, not int32
goroutine 1 [running]:
main.main()
type_assertion.go:12 +0xda
exit status 2
不过个别为了防止 panic,通过应用 ok 的形式
func main() {var x interface{} = 7
j, ok := x.(int32)
if ok {fmt.Println(reflect.TypeOf(j))
} else {fmt.Println("x not type of int32")
}
}
switch type
另外一种就是 variable.(type)配合 switch 进行类型判断
func main() {switch v := x.(type) {
case int:
fmt.Println("x is type of int", v)
default:
fmt.Printf("Unknown type %T!\n", v)
}
}
判断 struct 是否实现某个接口
type shape interface {getNumSides() int
getArea() int}
type rectangle struct {
x int
y int
}
func (r *rectangle) getNumSides() int {return 4}
func (r rectangle) getArea() int {return r.x * r.y}
func main() {
// compile time Verify that *rectangle implement shape
var _ shape = &rectangle{}
// compile time Verify that *rectangle implement shape
var _ shape = (*rectangle)(nil)
// compile time Verify that rectangle implement shape
var _ shape = rectangle{}}
输入
cannot use rectangle literal (type rectangle) as type shape in assignment:
rectangle does not implement shape (getNumSides method has pointer receiver)
小结
x.(T)
能够在运行时判断 x 是否为 T 类型,如果间接应用赋值,当不是 T 类型时则会产生 runtime panic- 应用
var _ someInterface = someStruct{}
能够在编译期间校验某个 struct 或者其指针类型是否实现了某个接口
doc
- Type_assertions
- Go : Check if type implements an interface
正文完