【Duke】不一样的接口,一样的多态 016 - PingPongGooo/GoFoundation GitHub Wiki

package polymorphsim

import (
	"fmt"
	"testing"
)

type Code string
type Programmer interface {
	WriteHelloWorld() Code
}

type GoProgrammer struct {  // 没有 使用implement 去和 programmer 绑定.
}

func (p *GoProgrammer) WriteHelloWorld() Code{
	return "hello world go"
}

type JavaProgrammer struct {  // 没有 使用implement 去和 programmer 绑定.
}


func (p *JavaProgrammer) WriteHelloWorld() Code{
	return "hello world java"
}

func writeFirstProgram(p Programmer)  {
	fmt.Printf("%T %v\n",p,p.WriteHelloWorld())
}


func TestPolymorphism(t *testing.T)  {

	goProg :=  new(GoProgrammer)
	javaProg :=  new(JavaProgrammer)
	writeFirstProgram(goProg)
	writeFirstProgram(javaProg)
}

空接口 与 断言

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

package empty_interface

import (
	"fmt"
	"testing"
)

func DoSomingthing(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 TestEmptyinterfaceAssertion(t *testing.T){
	DoSomingthing(10)
	DoSomingthing("10")
}

Go 接口最佳实践

倾向于使用小的接口定义,很多接口只包含一个方法

type Reader interface{
   Read(p []byte)(n int, err error)
}

type Writer interface{
   Write(p []byte)(n int, err error)
}

较大的接口定义, 可以有多个小接口定义组合而成

type ReadWriter interface{
    Reader
    Writer
}

只依赖于必要功能的最小接口 func StoreData(reader Reader) error{ ... }

在简单学习了设计模式之后,再来看go语法。。。 你会发现,go的设计。不亏是出自大师中大师之手。。。