这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
接口
动态语言 & 静态语言 -> 类型
package main
import (
"chapter2/infra"
"fmt"
)
func getRetriever() retriever {
return infra.Retriever{}
}
//?: Something that Can "Get"
type retriever interface {
Get(string) string
}
func main() {
var r retriever = getRetriever()
fmt.Println(r.Get("https://www.imooc.com"))
}
复制代码
duck typing
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
- 描述事物的外部行为而非内部结构
- 严格说Go属于结构化类型系统,类似duck typing
//C++中的duck typing
template <class R>
string download(const R& retriever) {
return retriever.get("www.baidu.com")
}
复制代码
接口的定义
使用者 ————> 实现者
downloader retriever
- 接口由使用者定义
- 接口的实现是隐式的,只要实现接口里的方法
接口变量里面有实现者的类型,也有指针和值
接口的值类型:类型和值
类型和值可以用swithc打印出来
也可以用Type assertion
package main
import (
"chapter2/retriever/mock"
"chapter2/retriever/real"
"fmt"
"time"
)
type Retriever interface {
Get(url string) string
}
func download(r Retriever) string {
return r.Get("https://www.imooc.com")
}
func main() {
var r Retriever
r = mock.Retriever{"this is a fake imooc.com"}
inspect(r)
r = &real.Retriever{
UserAgent: "Mozila/5.0",
TimeOut: time.Minute,
}
inspect(r)
//Type assertion
realRetriever := r.(*real.Retriever)
fmt.Println(realRetriever.TimeOut)
//fmt.Println(download(r))
}
func inspect(r Retriever) {
fmt.Printf("%T %v\n", r, r)
switch v := r.(type) {
case mock.Retriever:
fmt.Println("Contents: ", v.Contents)
case *real.Retriever:
fmt.Println("UserAgent: ", v.UserAgent)
}
}
复制代码
查看接口变量
- 表示任何类型:interface{}
- Type Assertion
- Type Switch
接口的组合
type ReaderWriter interface {
Reader
Writer
}
复制代码
常用系统接口
Stringer
Reader/Writer