duck typing
- 像鸭子就是鸭子
- 描述事物的外部结构,而非内部结构
- 严格说go属于结构化类型系统,类似duck typing.
- 接口可以进行组装
- 接口灵活性高
- 可以进行类型检查
接口定义与实现
- 接口由使用者定义
- 接口可以被任意对象实现
- 接口的实现是隐式的,只要实现了接口的方法,就是实现了接口
- 接口变量自带指针,不要取接口的地址
- 接口变量同样采用值传递,几乎不需要使用接口的指针
package main
import "fmt"
//定义了一个接口Retriver
type Retriver interface {
Get(url string) string
}
//使用者download
func download(r Retriver) string {
return r.Get("www.baidu.com")
}
//使用者去实现Get方法
type MockRetriever struct {
Contents string
}
//实现了接口Retriver的get方法,也就是实现了Retriver接口
func (r MockRetriever) Get(url string) string {
return r.Contents
}
func main(){
var r Retriver
r = MockRetriever{Contents:"this is a interface test!"}
fmt.Print(download(r))
}
打印对象类型
package main
import (
"hans/learn/other/retriever/real"
"fmt"
"hans/learn/other/retriever/mock"
)
//定义了一个接口Retriver
type Retriver interface {
Get(url string) string
}
//使用者download
func download(r Retriver) string {
return r.Get("http://www.baidu.com")
}
func main(){
var r Retriver
r = real.Retriver{}
inspect(r)
//断言测试
if mockRetriever ,ok := r.(mock.Retriever);ok{
fmt.Println(mockRetriever.Contents)
}else{
fmt.Println("not a mock retriever")
}
}
func inspect (r Retriver){
fmt.Printf("%T %v\n",r,r)
switch v :=r.(type) {
case mock.Retriever:
fmt.Println("Contents:",v.Contents)
case *real.Retriver:
fmt.Println("Contents:",v.UserAgent)
}
}
接口的组合
网友评论