- duck typing:鸭子类型,个人理解为——就是说这个类型本身是什么类型并不重要,如果它中间含有实例的可执行方法,那么直接调用,反之则报异常,不会因为类型原因而产生的方法不能调用。
import "testing"
type Programmer interface {
WriteHelloWorld() string
}
// 鸭子类型
type GoProgarmmer struct {
}
func (g *GoProgarmmer) WriteHelloWorld() string {
return "fmt.Println(\"Hello World\")"
}
func TestClient(t *testing.T) {
var p Programmer
p = new(GoProgarmmer)
t.Log(p.WriteHelloWorld())
}
Go接口特性:
1,非入侵性:实现不依赖于接口定义,类似于Python中类的方法。
Go语言中的“继承”
Go语言中并不像Python有 继承 这一特性,今天的课程是通过鸭子类来模拟类似于继承的效果,但内核是通过对鸭子类的调用来实现的,并非真正的继承,这方面思路还是从鸭子类的调用来理解。
type Pet struct {
}
func (p *Pet) Speak() {
fmt.Print("...")
}
func (p *Pet) SpeakTo(host string) {
p.Speak()
fmt.Println(" ", host)
}
type Dog struct {
Pet
}
func (d *Dog) Speak() {
fmt.Println("Wang!")
}
//func (d *Dog) SpeakTo(host string) {
// d.Speak()
// fmt.Println(" ", host)
//}
func TestDog(t *testing.T) {
dog := new(Dog)
dog.SpeakTo("Chao")
}
// 输出:... Chao 并不能继承
Go语言中的多态:
// Go语言中的多态,通过duck类与接口实现多态
type Code string
type Programmer interface {
WriteHelloWorld() Code
}
type GoProgrammer struct {
}
func (p *GoProgrammer) WriteHelloWorld() Code {
return "fmt.Println(\"Hello World\")"
}
type JavaProgrammer struct {
}
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)
javaProg := new(JavaProgrammer)
writeFirstProgram(goProg)
writeFirstProgram(javaProg)
}
空接口与断言:
- 空接口可以表示任何类型;
- 通过断言来将空接口转换为制定类型
复习一波swicth
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")
}
}
func TestEmptyInterfaceAccertion(t *testing.T) {
DoSomething("Ash")
DoSomething(10)
}
// String Ash
// Integer 10
接口实践建议:
- Go语言中建议使用小接口书写(单一方法接口)
- 大接口由小接口组合而成,思路——大接口中调用小接口实例
- 调用接口的方法只调用最小接口