1.接口的定义
接口由使用者定义,而非由实现者定义。
2.接口的实现
接口的实现是隐式的,不需要显示地声明实现了哪一个接口,只需要实现该接口中的方法即可。
main.go:
package mainimport "fmt"// 由使用者来定义接口type Retriever interface {Get(url string) string}// 使用者func download(r Retriever) string {return r.Get("http://www.imooc.com")}func main() {var r Retrieverr = mock.Retriever{"this is a fake imooc.com"}r = real.Retriever{}fmt.Println(download(r))}
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)
}
