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 @ 2022-05-18 18:40  ascertain  阅读(15)  评论(0编辑  收藏  举报