类型断言

语法

varOfTypeA,ok = varOfInterfaceB.(TypeA)

即把 varOfInterfaceB 转换为  TypeA

varOfTypeA: 断言成功则是得到的新类型变量,如果断言则是 nil,且会报 panic
ok : 一个 bool, 用于判断断言是否成功,可以不存在,只有一个返回值就是 varOFTypeA
varOfInterfaceB: 接口实例变量,接口的动态类型
TypeA: 一个具体的类型,或者一个接口,如果是具体类型则判断 varOfInterfaceB 是否是此类型,如果是接口,这判断 varOfInterfaceB 的动态类型是否实现了此接口

例子

var b interface{ S() }

var a interface{} = 10
// a 是接口实例,动态类型是 int
// 判断 a 的动态类型是否是 string,此处 int 不是 string,故 failed
// 把 string 改为 int,这为 succesful
// 把 string 改为 b,则判断 a 是否为 接口 b,显然 failed
// 把 string 改为 interface{},这判断 a 是否为空接口,故 successful
_, ok := a.(string)
if !ok {
	fmt.Println("failed")
} else {
	fmt.Println("successful")
}
// Animal 接口
type Animal interface {
	Speak(msg string)
}

type dog struct {
}

// dog 实现了 Animal 接口
func (d dog) Speak(msg string) {
	fmt.Println("dog say:" + msg)
}

type cat struct {
}

// cat 实现了 Animal 接口
func (c cat) Speak(msg string) {
	fmt.Println("cat say:" + msg)
}

func main() {
	// animal 是 Animal 接口的实例变量
	var animal Animal
    // 一个新接口
	type aa interface{ aaa(i string) }
	// animal 的动态类型变为 cat struct
	animal = cat{}

   // animal 的动态类型是 cat , cat 实现了 Animal 接口,故 successful
   // 若把 Animal 接口改为 aa 接口, animal 的动态类型是  cat, cat 没有实现 aa 接口,故 fialed
   // 若把 Animal 改为 cat{}, 则 animal 的动态类型就是 cat struct, 故 succeessful
   // 若把 Animal 改为 dog{} 或 int 或 string, 这 animal 的动态类型 是 cat,不符合,故 fialed
	_, ok := animal.(Animal)
	if !ok {
		fmt.Println("fialed!")
	} else {
		fmt.Println("successful!")
	}

}

判断 map 中 key 是否存在

dogs := map[string]int{"lily": 20, "lal": 18}
if _, ok := dogs["lucy"]; !ok {
	fmt.Println("Lucy not exsit!")
}

判断