断言

断言

【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 里还要自己写断言。

posted @ 2025-07-02 18:13  hutaodd  阅读(5)  评论(0)    收藏  举报