Go: Polymorphic Array
Polymorphic Array:
package main import ( "fmt" ) type USB interface { Start() Stop() } type Phone struct { Name string } func (p *Phone) Start() { fmt.Printf("%v start\n", p.Name) } func (p *Phone) Stop() { fmt.Printf("%v stop\n", p.Name) } type Camera struct { Name string } func (c *Camera) Start() { fmt.Printf("%v start\n", c.Name) } func (c *Camera) Stop() { fmt.Printf("%v stop\n", c.Name) } func main() { var array [3]USB array[0] = &Phone{Name: "Phone-1"} array[1] = &Phone{Name: "Phone-2"} array[2] = &Camera{Name: "Camera-1"} for _, v := range array { v.Start() v.Stop() println("~~~~~~~~~~~~~~~~~") } }
Type Assert:
package main import ( "fmt" ) type USB interface { Start() Stop() } type Phone struct { Name string } func (p *Phone) Start() { fmt.Printf("%v start\n", p.Name) } func (p *Phone) Stop() { fmt.Printf("%v stop\n", p.Name) } func (p *Phone) Call() { // Phone特有方法 fmt.Printf("%v call\n", p.Name) } type Camera struct { Name string } func (c *Camera) Start() { fmt.Printf("%v start\n", c.Name) } func (c *Camera) Stop() { fmt.Printf("%v stop\n", c.Name) } type Computer struct { } func (c *Computer) work(usb USB) { usb.Start() if phone, ok := usb.(*Phone); ok { phone.Call() } usb.Stop() } func main() { // 定义一个USB接口数组, 存放Phone & Camera结构体比哪里, 多态 var array [3]USB array[0] = &Phone{Name: "Phone-1"} array[1] = &Phone{Name: "Phone-2"} array[2] = &Camera{Name: "Camera-1"} // Phone特有方法Call() var computer Computer for _, v := range array { computer.work(v) } }
package main import ( "fmt" ) type Vale struct { } func TypeAssert(items ...interface{}) { for i, v := range items { switch v.(type) { case bool: fmt.Printf("index: %d, %v bool\n", i, v) case float32: fmt.Printf("index: %d, %v float32\n", i, v) case float64: fmt.Printf("index: %d, %v float64\n", i, v) case int: fmt.Printf("index: %d, %v int\n", i, v) case int32: fmt.Printf("index: %d, %v int32\n", i, v) case int64: fmt.Printf("index: %d, %v int64\n", i, v) case string: fmt.Printf("index: %d, %v string\n", i, v) case Vale: fmt.Printf("index: %d, %v Vale\n", i, v) case *Vale: fmt.Printf("index: %d, %v *Vale\n", i, v) default: fmt.Printf("index: %d, %v default\n", i, v) } } } func main() { var b1 float32 = 5.5 var b2 float64 = 5.5 var b3 int32 = 55 var name string = "qwer" vale1 := Vale{} vale2 := &Vale{} TypeAssert(b1, b2, b3, name, vale1, vale2) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-05-18 npm
2021-05-18 MySQL: Pagination