【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的设计。不亏是出自大师中大师之手。。。