test.Retriever
package test
type Retriever struct {
Contents string
}
func (r *Retriever) Get(url string) string {
return r.Contents
}
func (r *Retriever)Post(url string,form map[string]string)string{
r.Contents = form["contents"]
return "ok"
}
main
package main
import (
"fmt"
"learngo/retriever/test"
)
type Retriever interface {
Get(url string) string
}
type Poster interface {
Post(url string, from map[string]string) string
}
type RetrieverPoster interface {
Retriever
Poster
}
const url = "https://blog.csdn.net/qq_43135259/article/details/123298792?spm=1001.2014.3001.5502"
func download(r Retriever) string {
return r.Get(url)
}
func post(poster Poster) {
poster.Post(url, map[string]string{
"name": "番茄炒蛋",
"age": "22",
})
}
func session(r RetrieverPoster) string {
r.Post(url, map[string]string{
"contents": "another faked contents",
})
return r.Get(url)
}
func main() {
s := &test.Retriever{"this is fake contents"}
//another faked contents
fmt.Println(session(s))
}
接口组合在go语言中赋予了接口非常大的灵活性,我们可以在使用的时候去描述我们要的一个东西需要有什么能力;像这种例子在我们标准库里面有很多;比如说ReadWriteCloser;ReadCloser;WriteCloser;ReadWriter