类型断言
GO的类型断言,是一个使用在接口值上面的操作,检查接口变量的值是否实现了期望的接口或者具体的类型。
// +build ignore
package main
import (
"fmt"
)
type a1 interface{
f2()
}
type s1 struct{}
// s1对象实现了a1接口
func (s *s1) f2() {}
func main() {
var x interface{}
x = new(s1)
// 类型断言 判断接口变量x的值是否实现了a1接口
if v,ok := x.(a1);ok {
fmt.Println(v,",",ok) // &{},true
} else {
fmt.Println(v,",",ok)
}
// 类型断言 判断接口变量x的值是否是具体的int类型
x = 10
if v,ok := x.(int);ok {
fmt.Println(v,",",ok) // 10,true
} else {
fmt.Println(v,",",ok)
}
// 配合switch来使用
getType(x) // int
var x2 string = "zs"
var x3 s1 = s1{}
x4 := new(s1)
getType(x2) // string
getType(x3) // s1
getType(x4) // a1:x4对应的类型实现了a1接口
}
func getType(x interface{}) {
switch x.(type) {
case int:
fmt.Println("int")
case string:
fmt.Println("string")
case *int:
fmt.Println("*int")
case s1:
fmt.Println("s1")
case a1:
fmt.Println("a1")
}
}
小结:
- 类型断言是操作于接口变量的,常用于获取interface{}变量的值;
- 类型断言用于检查接口类型的变量是否实现了期待的接口;
- 类型不确定时,可以配合switch来使用;
- 格式
value,ok := x.(T)
,T是具体的类型,也可以是接口类型,ok不能缺少,否则会panic。