断言
普通断言
- 普通断言(可用做类型转换):X是接口类型,T可以是非接口类型,若想断言合法,T必须实现接口X
- 若T实现了X,则成功转换,否则抛出panic,程序中断
- 语法
-
c := X.(T)
动态检查(安全)断言
- flag是一个bool,若T实现了X,则flag为true,否则为false,其余和普通断言一致,通过bool类型的flag可进行判断,实现对应的操作,若结果过多可结合switch + type进行操作
- 为什么说是安全呢?因为就算X的实际类型不是你所断言的类型T,也不会报错从而中断,而会继续执行(若断言失败后,调用T的方法仍会执行,跳转至方法案例)
- 语法
-
c,flag := X.(T)
- 但注意:T必须实现了X,否则该断言本身就不合法,直接报错
switch + type判断
// 定义一个函数:专门用来打招呼
func greet(s SayHello){
s.sayHello()
switch s.(type){
case Chinese:
ch := s.(Chinese)
ch.niuYangGe()
case American:
am := s.(American)
am.disco()
}
fmt.Println("打招呼~~~")
}
代码案例
package main
import "fmt"
// 定义一个SayHello接口
type SayHello interface{
sayHello()
}
// 定义中国人、美国人的结构体
type Chinese struct{
}
type American struct{
}
// 为中国人、美国人实现接口
func (ch Chinese) sayHello(){
fmt.Println("中国--你好")
}
func (am American) sayHello(){
fmt.Println("American--hello")
}
//案例一:普通断言
func main(){
am := American{}
var s SayHello = am
c := s.(Chinese) //抛出panic:类型不同,panic: interface conversion: main.SayHello is main.American, not main.Chinese
fmt.Println(c)
}
//案例二:安全断言
func main(){
am := American{}
var s SayHello = am
c,falg := s.(Chinese)
fmt.Println(c,falg) //程序正常运行:打印 {} false
}
方法案例
package main
import "fmt"
// 定义一个SayHello接口
type SayHello interface{
sayHello()
}
// 定义中国人、美国人的结构体
type Chinese struct{
}
type American struct{
}
// 为中国人、美国人实现接口
func (ch Chinese) sayHello(){
fmt.Println("中国--你好")
}
func (am American) sayHello(){
fmt.Println("American--hello")
}
// 为中国人、美国人添加各自特有的方法
func (ch Chinese) niuYangGe(){
fmt.Println("扭秧歌")
}
func (am American) disco(){
fmt.Println("野狼disco")
}
// 定义一个函数:专门用来打招呼
func greet(s SayHello){
s.sayHello()
// 当调用特有方法时,使用断言
ch,flag := s.(Chinese)
ch.niuYangGe()
fmt.Println(ch,flag,"打招呼~~~")
}
func main(){
ch := Chinese{}
am := American{}
greet(ch)
greet(am)
/* 打印结果:
中国--你好
扭秧歌
{} true 打招呼~~~
American--hello
扭秧歌
{} false 打招呼~~~
*/
}
记录学习时的知识点和疑惑,若有错误,请大佬们多多指点。