先上代码
定义一个接口 Retriever
两个接口的实现
infra.go
package main
import (
"fmt"
"robot.com/Robot/learngo/testing"
//"robot.com/Robot/learngo/infra"
)
// ?: Something that can "Get"
type retriever interface {
Get(string) string
}
func getRetriever() retriever {
//return infra.Retriever{}
return testing.Retriever{}
}
func main() {
var r retriever = getRetriever()
fmt.Println(r.Get("https://www.imooc.com"))
}
testing.go
package testing
type Retriever struct {
}
func (Retriever) Get(url string) string {
return "fake content"
}
使用
downloader.go
package main
import (
"fmt"
"robot.com/Robot/learngo/testing"
//"robot.com/Robot/learngo/infra"
)
// ?: Something that can "Get"
type retriever interface {
Get(string) string
}
func getRetriever() retriever {
//return infra.Retriever{}
return testing.Retriever{}
}
func main() {
var r retriever = getRetriever()
fmt.Println(r.Get("https://www.imooc.com"))
}
代码说明
在 infra.go和testing.go中,我们定义了Retriever结构体,以及他的成员方法Get
在downloader.go中,如何无缝使用这两个结构体的方法呢?
- 我们在downloader.go 定义了一个接口retriever,里面定义了一个方法Get,这样我们就可以使用这个接口类型了
- 定义了getRetriever方法,统一返回Retriever
- main方法里面,定义var r这个retriever接口类型,我们就可以无缝调用不同模块的Get方法
更有趣的解释
这里拿手机充电,充电的TypeC口,电源|充电宝来类比一下,我们手机没电的时候,需要充电,我们可以用充电宝或者插座来获取到电源,但是如何才能让充电宝的电和插座里的电平滑的充电到手机呢,TypeC的接口有着无可替代的作用,上面的接口就可以类比与这里的接口,无论在哪里,只要我们有电源,无论是插座还是充电宝(Retriever),连接充电线(getRetriever)我们通过这个TypeC接口(retriever)获取到电源。
标签:Get,testing,接口,golang,概念,go,充电,retriever,Retriever From: https://www.cnblogs.com/zsjlovewm/p/17608371.html