美文网首页
golang-接口

golang-接口

作者: 6a91e15c5cde | 来源:发表于2018-04-06 17:40 被阅读39次

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)
    }

}

接口的组合

相关文章

网友评论

      本文标题:golang-接口

      本文链接:https://www.haomeiwen.com/subject/pcdshftx.html