Go 语言函数实现接口(将函数当做接口来调用)

更新时间 2022-03-31 15:08:13

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

Go 语言 中,其他基本类型能够实现接口,函数 同样可以实现接口。

一、如何定义一个接口

下面我们定义一个名为狗 Dog 的接口:

// 定义一个名为 Dog 的接口
type Dog interface {
  // 需要实现一个姓名 Name() 方法
	Say(interface{})
}

上面这个接口需要实现 Say() 方法,调用时需传入一个 interface{} 类型的变量。这是个啥类型呢?这种类型表示你可以传入任意类型的值。

接下来,我们将实现这个接口。实现接口有两种方式:

  • 结构体实现接口;
  • 函数体实现接口;

二、结构体实现接口

下面将定义一个哈士奇的结构体,并实现 Dog 接口,代码如下:

// 定义一个结构体类型:哈士奇
type Husky struct {
}

// 实现接口 Dog 定义的 Say 方法,方法中打印一句话
func (s *Husky)Say(p interface{})  {
	fmt.Println("哈士奇说: ", p)
}

接下来,将定义的 Husky类型实例化并调用接口方法,代码如下:

// 定义接口
var dog Dog
// 实例化哈士奇结构体
husky := new(Husky)
// 将实例化的结构体赋给接口
dog = husky
// 使用接口调用实例化结构体的方法 Say()
dog.Say("犬小哈教程")

代码输出如下:

哈士奇说:  犬小哈教程

二、函数实现接口

函数要想实现接口,需要先将自己定义为类型,然后实现接口方法,同时需要再方法中调用函数本体,示例代码如下:

// 将函数定义为类型
type FuncHusky func(interface{})

// 实现接口 Dog 的 Say 方法
func (f FuncHusky) Say(p interface{})  {
	// 调用 f() 函数本体
	f(p)
}

FuncHusky 无需实例化,只需要将函数转换为 FuncHusky 类型即可,示例代码如下:

// 定义接口
var dog Dog
// 将匿名函数转换为 FuncHusky 类型,此时 FuncHusky 类型实现了 Say 方法,赋值给接口是成功的
dog = FuncHusky(func(i interface{}) {
  fmt.Println("哈士奇说: ", i)
})
// 使用接口调用 Call 方法
dog.Say("犬小哈教程")

代码输出如下:

哈士奇说:  犬小哈教程

图示:

go语言函数实现接口示例代码go语言函数实现接口示例代码