本文主要研究一下golang的类型断言
x.(T)
- 断言x不为nil且x为T类型
- 如果T不是接口类型,则该断言x为T类型
- 如果T类接口类型,则该断言x实现了T接口
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
输出
intpanic: interface conversion: interface {} is int, not int32goroutine 1 [running]:main.main() type_assertion.go:12 +0xdaexit 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") }}
另外一种就是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!", v) }}
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或者其指针类型是否实现了某个接口
- Type_assertions
- Go : Check if type implements an interface