序
本文主要研究一下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
有疑问加站长微信联系(非本文作者)