Go 编程 | 连载 23 - 函数实现接口

简介: Go 编程 | 连载 23 - 函数实现接口

一、函数实现接口

Go 语言中除了结构体能够实现接口外,函数作为一等公民也可以实现接口。那么结构体实现接口和函数实现接口有什么区别?

结构体实现接口

定义一个接口 Fighter 以及一个结构体 Hero,Hero 实现 Fighter 接口的 Fight 方法时,方法的接收者为结构体指针。

package main
import "fmt"
func main(){
   // 声明接口变量
   var fighter Fighter
   // 函数接收者是一个指针
   hero := Hero{"Peter"}
   heroPtr:= &hero
   // Hero 实现 Fighter 接口时函数接收者为结构体指针类型,所有只能将
   // 结构体指针赋值给 fighter 接口变量
   fighter = heroPtr
   fighter.Fight("Suit")
}
type Fighter interface {
   Fight(interface{})
}
type Hero struct {
   Name string
}
// 结构体实现接口
func (h *Hero) Fight(interface{}) {
   fmt.Println(h.Name + " is Fighting!")
}
复制代码

执行上述代码,输出结果如下:

Peter is Fighting!
复制代码

函数实现接口

函数的声明不能直接实现接口,需要将函数定义为类型后,使用类型实现结构体。当类型方法被调用时,还需要调用函数本体。

package main
import "fmt"
func main(){
   // 声明接口变量
   var fighter Fighter
   // 实例化一个函数类型对象
   funcFighterInstance := FuncFighter(func(v interface{}) {
      fmt.Println(v, "is Fighting")
   })
   // 赋值给接口变量
   fighter = funcFighterInstance
   fighter.Fight("Peter")
}
type Fighter interface {
   Fight(interface{})
}
// 定义一个函数类型
type FuncFighter func(interface{})
// 实现 Fighter 接口的 Fight 方法
func ( funcFighter FuncFighter) Fight(i interface{}) {
   // 调用函数本体,在实例化函数对象时实现函数具体功能,或者直接再次实现函数具体功能,但是实例化函数时定义的函数实现功能会被覆盖。
   // 建议直接在这里调用函数本体,在实例化对象时再实现函数的具体功能。
   funcFighter(i)
}
复制代码

执行上述代码,输出结果如下:

Peter is Fighting
复制代码

当类型方法被调用时可以直接实现函数的内容不用调用函数本体,如果调用函数本体,那就需要在实例化函数类型对象时实现函数的具体内容。

函数与结构体实现的区别就在于结构体可以直接实现接口,而函数实现接口则需要使用 type 关键字定义一个函数类型,在通过该函数类型实现接口,并将该函数类型的实例化对象赋值给接口变量,这样就可以通过接口变量来调用函数类型实现的接口功能。


相关文章
|
23天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
38 1
|
1月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
42 7
|
1月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
1月前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
21 3
|
2月前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
54 7
|
2月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
3月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
37 7
|
2月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化