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 */
本文来自博客园,作者:元贞,转载请注明原文链接:https://www.cnblogs.com/yuleicoder/articles/14319362.html
浙公网安备 33010602011771号