18丨不一样的接口类型,一样的多态

多态与空接口

多态

 

测试代码

package ch13

import (
    "fmt"
    "testing"
)

//定义一种类型

type Code string

// 定义一个接口
type Programmer interface {
    WriteHelloWorld() Code
}

//定义一个GoProgrammer类
type GoProgrammer struct {
}

//给GoProgrammer,定义一个WriteHelloWorld方法,实现接口
func (p *GoProgrammer) WriteHelloWorld() Code {
    return "fmt.Println(\" Hello World!\")"
}

//定义一个JavaProgrammer类
type JavaProgrammer struct {
}

//给 JavaProgrammer ,定义一个WriteHelloWorld方法,实现接口
func (p *JavaProgrammer) WriteHelloWorld() Code {
    return "System.out.Println(\" Hello World!\")"
}

//定义一个函数来统一调用
func writeFirstProgram(p Programmer) {
    fmt.Printf("%T %v\n", p, p.WriteHelloWorld())
}

func TestPolymorphism(t *testing.T) {
    // 实例化一个对象
    goProg := new(GoProgrammer)
    //goProg2 := &GoProgrammer{}
    javaProg := new(JavaProgrammer)

    writeFirstProgram(goProg) // 调用接口
    writeFirstProgram(javaProg)
}

/*
=== RUN   TestPolymorphism
*ch13.GoProgrammer fmt.Println(" Hello World!")
*ch13.JavaProgrammer System.out.Println(" Hello World!")
--- PASS: TestPolymorphism (0.00s)
PASS*/

 

空接口与断言

1. 空接⼝可以表示任何类型
2. 通过断⾔来将空接⼝转换为制定类型
v, ok := p.(int) //ok=true 时为转换成功

 

Go接口最佳实践

 

 

 测试代码

package ch13

import (
    "fmt"
    "testing"
)

func DoSomething(p interface{}) {
    //if i, ok := p.(int); ok {
    //    fmt.Println("Integer", i)
    //    return
    //}
    //if s, ok := p.(string); ok {
    //    fmt.Println("string", s)
    //    return
    //}
    //fmt.Println("Unknow Type")

    switch v := p.(type) {
    case int:
        fmt.Println("Integer", v)
    case string:
        fmt.Println("String", v)
    default:
        fmt.Println("Unknow Type")
    }
}

func TestEmtyInterfaceAssertion(t *testing.T) {
    DoSomething(10)
    DoSomething("10")
}

/*
=== RUN   TestEmtyInterfaceAssertion
Integer 10
String 10
--- PASS: TestEmtyInterfaceAssertion (0.00s)
PASS
*/

 

posted @ 2021-01-23 22:35  元贞  阅读(70)  评论(0)    收藏  举报