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