断言
断言
【1】什么是断言?
Go语言里面有一个语法,可以直接判断是否是该类型的变量:value,ok=element.(T),这里value就是变量的值,ok是一个bool类
型,element是interface变量,T是断言的类型。
【2】断言的案例引入:
package main
import (
"fmt"
)
//接口的定义:定义规则、定义规划,定义某种能力:
type SayHello interface {
sayHello()
}
//接口的实现:定义一个结构体:
//中国人:
type Chinese struct {
name string
}
//实现接口的方法--->具体的实现:
func (peroson Chinese) sayHello() {
fmt.Println("你好")
}
//中国人特有的方法:
func (peroson Chinese) niuYangGe() {
fmt.Println("东北文化")
}
//接口的实现:定义一个结构体:
//美国人:
type American struct {
name string
}
//实现接口的方法--->具体的实现:
func (peroson American) sayHello() {
fmt.Println("hi")
}
//定义以一个函数,用来各国人打招呼,
//这个函数的参数是一个接口类型
func greet(s SayHello) {
s.sayHello()
//如果是中国人,还可以调用中国人特有的方法
//断言
var ch Chinese = s.(Chinese)//看s是否可以转成Chinese类型并且赋给ch变量
ch.niuYangGe()
}
//自定义数据类型:
type intager int
func(i intager) sayHello(){
fmt.Println("say hi", i)
}
func main() {
//定义一个中国人
c:= Chinese{} //定义一个中国人
//定义一个美国人
//a:= American{} //定义一个美国人
greet(c) //调用函数,传入中国人
//greet(a) //调用函数,传入美国人
}
解决第二个返回值:
package main
import (
"fmt"
)
//接口的定义:定义规则、定义规划,定义某种能力:
type SayHello interface {
sayHello()
}
//接口的实现:定义一个结构体:
//中国人:
type Chinese struct {
name string
}
//实现接口的方法--->具体的实现:
func (peroson Chinese) sayHello() {
fmt.Println("你好")
}
//中国人特有的方法:
func (peroson Chinese) niuYangGe() {
fmt.Println("东北文化")
}
//接口的实现:定义一个结构体:
//美国人:
type American struct {
name string
}
//实现接口的方法--->具体的实现:
func (peroson American) sayHello() {
fmt.Println("hi")
}
//定义以一个函数,用来各国人打招呼,
//这个函数的参数是一个接口类型
func greet(s SayHello) {
s.sayHello()
//如果是中国人,还可以调用中国人特有的方法
//断言
ch,flag := s.(Chinese)//看s是否可以转成Chinese类型并且赋给ch变量
if flag {
ch.niuYangGe() //如果可以转成Chinese类型,就调用中国人特有的方法
}else{
fmt.Println("美国人不会扭秧歌")
}
}
//自定义数据类型:
type intager int
func(i intager) sayHello(){
fmt.Println("say hi", i)
}
func main() {
//定义一个中国人
c:= Chinese{} //定义一个中国人
//定义一个美国人
//a:= American{} //定义一个美国人
greet(c) //调用函数,传入中国人
//greet(a) //调用函数,传入美国人
}
更简略的语法:
if ch,flag := s.(Chinese);flag {
ch.niuYangGe() //如果可以转成Chinese类型,就调用中国人特有的方法
}else{
fmt.Println("美国人不会扭秧歌")
}
【3】TypeSwitch的基本用法
TypeSwitch是Go语言中一种特殊的switch语句,它比较的是类型而不是具体的值。它判断某个接口变量的类型,然后根据具体类型再做相应
处理。
switch v := s.(type) {
case Chinese:
v.niuYangGe()
case American:
v.disco()
}
// switch s.(type) {
// case Chinese:
// ch := s.(Chinese)
// ch.niuYangGe()
// case American:
// am := s.(American)
// am.disco()
// }
}
//自定义数据类型:
type intager int
func(i intager) sayHello(){
fmt.Println("say hi", i)
}
func main() {
//定义一个中国人
c:= Chinese{} //定义一个中国人
//定义一个美国人
//a:= American{} //定义一个美国人
greet(c) //调用函数,传入中国人
//greet(a) //调用函数,传入美国人
}
第一种写法其实就是类型分支(type switch)自带类型断言,你不用手动写断言,Go 会自动帮你把接口变量 s 转换成对应的具体类型,并赋值给 v。
switch v := s.(type) {
case Chinese:
// 这里的 v 已经是 Chinese 类型,无需再断言
v.niuYangGe()
case American:
v.disco()
}
第一种写法不需要你手动断言,case 里的 v 已经是具体类型了,可以直接用。
而第二种写法 case 里还要自己写断言。

浙公网安备 33010602011771号