golang断言实践
package main import "fmt" type Usb interface { Start() Stop() } //手机 type Phone struct { Name string } //相机 type Camera struct { Name string } //计算机 type Computer struct { } //手机实现USB接口方法 func (p Phone) Start() { fmt.Println("手机开始工作...") } func (p Phone) Stop() { fmt.Println("手机停止工作...") } func (p Phone) Call() { //该方法未定义 fmt.Println("我是手机,我要打电话...") } //相机实现USB接口方法 func (c Camera) Start() { fmt.Println("相机开始工作...") } func (c Camera) Stop() { fmt.Println("相机停止工作...") } //编写一个方法Working,接收一个USB接口类型变量 //实现了USB接口的所有方法 func (c Computer) Working(usb Usb) { //通过usb接口变量调用start和stop方法 usb.Start() //如果USB是指向Phone结构体变量,还需要调用Call方法 phone, ok := usb.(Phone) if ok { phone.Call() } usb.Stop() } func main() { var usbArr [3]Usb usbArr[0] = Phone{} usbArr[1] = Camera{} usbArr[2] = Phone{} //Phone还有一个特有的方法call(),请遍历Usb数组,如果是Phone变量, //除了调用Usb接口声明的方法外,还需要调用Phone特有方法Call(类型断言) var computer Computer for _, v := range usbArr { computer.Working(v) } }
package main import "fmt" 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 float64, float32: fmt.Printf("第%v个参数是 float 类型,值是%v\n", index, x) case int, int32, int64: fmt.Printf("第%v个参数是 int 类型,值是%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 类型不确定", index, x) } } } func main() { var n1 float32 = 1.1 var n2 float64 = 2.2 var n3 int32 = 30 var name string = "tom" address := "北京" n4 := 300 stu := student{} stu1 := &student{} TypeJudge(n1, n2, n3, n4, name, address, stu, stu1) }