Golang的类型断言

  类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式:

y, ok := x.(type)

  上面的语句用于判断变量x是不是type类型,有两种结果:

    1. x是type类型的变量,那么返回x的副本赋值给y,ok的值为true
    2. 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到底是什么样的类型。

  

posted @ 2018-03-29 10:37  寻觅beyond  阅读(412)  评论(0编辑  收藏  举报
返回顶部