go_组合接口
main函数入口
package main
import (
"fmt"
"learngo/retriever/mock"
"learngo/retriever/real"
"time"
)
func main(){
var r Retriever
retriever := mock.Retriever{"this is fyf"}
inspect(r)
r = &real.Retriever{
UserAgent:"Mozilla/5.0",
TimeOut:time.Minute,
}
inspect(r)
//Type assertion
reaRetriever:=r.(*real.Retriever)
fmt.Println(reaRetriever.TimeOut)
//fmt.Println(download(r))
fmt.Println(session(&retriever))
}
//interface中的函数不用加func
type Retriever interface {
Get(url string) string
}
type Poster interface {
Post(url string ,form map[string]string) string
}
const url = "http://www.imooc.com"
func post(p Poster){
p.Post(url,map[string]string{
"name":"fyf",
"cource":"golang",
})
}
//组合interface,RetrieverPoster内部装了两个interface
type RetrieverPoster interface {
Retriever
Poster
}
func session (r RetrieverPoster) string{
r.Post(url,map[string]string{
"contents":"this is another",
})
return r.Get(url)
}
func download(r Retriever) string{
return r.Get(url)
}
func inspect(r Retriever){
fmt.Printf("%T %v\n",r,r)
switch v:=r.(type) {
case *mock.Retriever:
fmt.Println("Contents",v.Contents)
case *real.Retriever:
fmt.Println("UserAgent",v.UserAgent)
}
}
实现了两个接口
package mock
import "fmt"
type Retriever struct {
Contents string
}
func (r *Retriever) String() string {
return fmt.Sprintf("Retriever:{Contents=%s}",r.Contents)
}
//接口1
func (r *Retriever) Post(url string, form map[string]string) string {
r.Contents = form["contents"]
return "ok"
}
//go语言中实现了Get(url string),就被认为实现了Retriever接口
//接口2
func (r *Retriever) Get(url string) string {
return r.Contents
}
浙公网安备 33010602011771号