Golang的类型断言
类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式:
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到底是什么样的类型。
如需转载,请注明文章出处,谢谢!!!