类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式:
y, ok := x.(type)
上面的语句用于判断变量x是不是type类型,有两种结果:
- x是type类型的变量,那么返回x的副本赋值给y,ok的值为true
- x不是type类型的变量,那么返回一个空的stuct,ok的值为false
注意判断x是不是type类型的变量时,那么 type类型的结构(struct) 就必须实现 x类型的接口,否则进行类型断言是不合法的。
看一个完整的示例:
package main import "fmt" type human interface {
say()
}
type stu struct {
name string
} func (s stu) say() {
fmt.Println("his name is ", s.name)
}
func hide(h human) {
//进行类型断言
//前提是stu的结构类型(struct)必须实现 h类型的接口
if p, ok := h.(stu); ok {
fmt.Print("是stu的结构类型 ")
fmt.Println(p.name, ok)
} else {
fmt.Println("不是stu的结构类型")
}
}
func main() {
var h human
h = stu{name: "xyz"}
h.say()
hide(h)
}
可以在进行类型断言的func那里传入一个空接口(空接口本身没有任何方法,则所有结构都实现了空接口,此时空接口类似其他语言中的超类Object),所以可以有更多的类型断言,根据传入类型进行不同操作,还可以使用 switch type ,
示例如下:
func hide(x interface{}) {
switch v := x.(type) {
case stu:
fmt.Println(v.name)
default:
fmt.Println("none")
}
}
注意上面的是 x.(type),并没有指定type类型,反而让系统去猜x到底是什么样的类型。