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)
}
复制代码

 

posted @   ascertain  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-05-18 npm
2021-05-18 MySQL: Pagination
点击右上角即可分享
微信分享提示