golang 接口的概念

先上代码

定义一个接口 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)获取到电源。

posted @ 2023-08-05 18:14  robot-Z  阅读(24)  评论(0编辑  收藏  举报