1.接口的定义
    image.png
    接口由使用者定义,而非由实现者定义。

    2.接口的实现
    接口的实现是隐式的,不需要显示地声明实现了哪一个接口,只需要实现该接口中的方法即可。
    main.go:

    1. package main
    2. import "fmt"
    3. // 由使用者来定义接口
    4. type Retriever interface {
    5. Get(url string) string
    6. }
    7. // 使用者
    8. func download(r Retriever) string {
    9. return r.Get("http://www.imooc.com")
    10. }
    11. func main() {
    12. var r Retriever
    13. r = mock.Retriever{"this is a fake imooc.com"}
    14. r = real.Retriever{}
    15. fmt.Println(download(r))
    16. }

    mockretriever.go:

    package mock
    
    // 实现者:只要实现了Get方法就相当于实现了Retriever接口
    type Retriever struct {
        Contents string
    }
    
    func (r Retriever) Get(url string) string {
        return r.Contents
    }
    

    retriever.go:

    package real
    
    import (
        "net/http"
        "net/http/httputil"
        "time"
    )
    
    // 实现者:只要实现了Get方法就相当于实现了Retriever接口
    type Retriever struct {
        UserAgent string
        TimeOut time.Duration
    }
    
    func (r Retriever) Get(url string) string {
        resp, err := http.Get(url)
        if err != nil {
            panic(err)
        }
    
        result, err := httputil.DumpResponse(
            resp, true)
    
        resp.Body.Close()
    
        if err != nil {
            panic(err)
        }
    
        return string(result)
    }