Go 类型断言的实践案例(含类型推断函数实现)

    技术2025-12-21  11

    类型断言的实践案例

    案例1

    在前面的 Usb 接口案例做改进: 给 Phone 结构体增加一个特有的方法 call(),当 Usb 接口接收的是 Phone 变量时,还需要调用 call方法  package main import ( "fmt" ) //声明/定义一个接口 type Usb interface { //声明了两个没有实现的方法 Start() Stop() } type Phone struct { name string } //让Phone 实现 Usb接口的方法 func (p Phone) Start() { fmt.Println("手机开始工作。。。") } func (p Phone) Stop() { fmt.Println("手机停止工作。。。") } func (p Phone) Call() { fmt.Println("手机 在打电话..") } type Camera struct { name string } //让Camera 实现 Usb接口的方法 func (c Camera) Start() { fmt.Println("相机开始工作。。。") } func (c Camera) Stop() { fmt.Println("相机停止工作。。。") } type Computer struct { } func (computer Computer) Working(usb Usb) { usb.Start() //如果usb是指向Phone结构体变量,则还需要调用Call方法 //类型断言..[注意] if phone, ok := usb.(Phone); ok { phone.Call() } usb.Stop() } func main() { //定义一个Usb接口数组,可以存放Phone和Camera的结构体变量 //这里就体现出多态数组 var usbArr [3]Usb usbArr[0] = Phone{"vivo"} usbArr[1] = Phone{"小米"} usbArr[2] = Camera{"尼康"} //遍历usbArr //Phone还有一个特有的方法call(),请遍历Usb数组,如果是Phone变量, //除了调用Usb 接口声明的方法外,还需要调用Phone 特有方法 call. =》类型断言 var computer Computer for _, v := range usbArr{ computer.Working(v) fmt.Println() } //fmt.Println(usbArr) } 输出结果:


    案例2

    写一函数,循环判断传入参数的类型: package main import ( "fmt" ) //定义Student类型 type Student struct { } //编写一个函数,可以判断输入的参数是什么类型 func TypeJudge(items... interface{}) { for index, x := range items { switch x.(type) { case bool : fmt.Printf("第%v个参数是 bool 类型,值是%v\n", index, x) case float32 : fmt.Printf("第%v个参数是 float32 类型,值是%v\n", index, x) case float64 : fmt.Printf("第%v个参数是 float64 类型,值是%v\n", index, x) case int, int32, int64 : fmt.Printf("第%v个参数是 整数 类型,值是%v\n", index, x) case string : fmt.Printf("第%v个参数是 string 类型,值是%v\n", index, x) case Student : fmt.Printf("第%v个参数是 Student 类型,值是%v\n", index, x) case *Student : fmt.Printf("第%v个参数是 *Student 类型,值是%v\n", index, x) default : fmt.Printf("第%v个参数是 类型 不确定,值是%v\n", index, x) } } } func main() { var n1 float32 = 1.1 var n2 float64 = 2.3 var n3 int32 = 30 var name string = "tom" address := "北京" n4 := 300 stu1 := Student{} stu2 := &Student{} TypeJudge(n1, n2, n3, name, address, n4, stu1, stu2) } 输出结果:

    Processed: 0.010, SQL: 9