Interface in Golang |青训营笔记

57 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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