一、接口定义
//定义接口 type Programmer interface { WriteHelloWorld() string }
二、接口实现
type GoProgramer struct{} //接口的实现 方法签名一致 func (p *GoProgramer) WriteHelloWorld() string { return "hello" }
import "testing" //定义接口 type Programmer interface { WriteHelloWorld() string } type GoProgramer struct{} //接口的实现 方法签名一致 func (p *GoProgramer) WriteHelloWorld() string { return "hello" } func TestClient(t *testing.T) { var pro Programmer = new(GoProgramer) t.Log(pro.WriteHelloWorld()) }
=== RUN TestClient ch12_test.go:19: hello --- PASS: TestClient (0.00s) PASS
三、多态
import ( "fmt" "testing" ) //定义接口 type Programmer interface { WriteHelloWorld() string } type GoProgramer struct{} //接口的实现 方法签名一致 func (p *GoProgramer) WriteHelloWorld() string { return "go hello world" } type JavaProgramer struct{} //接口的实现 方法签名一致 func (p *JavaProgramer) WriteHelloWorld() string { return "java hello world" } func writeFirstProgram(p Programmer) { //%T类型 %v fmt.Printf("%T %v\n", p, p.WriteHelloWorld()) } func TestPloymorphism(t *testing.T) { //goProg := new(GoProgramer) goProg := &GoProgramer{} javaProg := new(JavaProgramer) writeFirstProgram(goProg) writeFirstProgram(javaProg) }
=== RUN TestPloymorphism *interface_test.GoProgramer go hello world *interface_test.JavaProgramer java hello world --- PASS: TestPloymorphism (0.00s) PASS
四、空接口
import ( "fmt" "testing" ) //使用小接口定义,较大接口,可以由多个小接口定义组合而成;只依赖必要功能的最小接口 func DoSomething(p interface{}) { //if i, ok := p.(int); ok { // fmt.Println("Integer", i) // return //} //if i, ok := p.(string); ok { // fmt.Println("string", i) // return //} //fmt.Println("Unkonw Type") switch v := p.(type) { case int: fmt.Println("Integer", v) case string: fmt.Println("string", v) default: fmt.Println("Unkonw Type") } } func TestEmptyInterfaceASssertion(t *testing.T) { DoSomething(10) DoSomething("hello") }
=== RUN TestEmptyInterfaceASssertion Integer 10 string hello --- PASS: TestEmptyInterfaceASssertion (0.00s) PASS
五、自定义type
import ( "fmt" "testing" "time" ) //自定义类型 简化代码 type IntConv func(op int) int //返回一个函数的运行时间 func timeSpent(inner IntConv) IntConv { return func(n int) int { start := time.Now() ret := inner(n) fmt.Println("time spent", time.Since(start).Seconds()) return ret } } func slowFun(op int) int { time.Sleep(time.Second * 1) return op } func TestFn(t *testing.T) { num := timeSpent(slowFun)(5) t.Log(num) }