美文网首页
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