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 关键字定义一个函数类型,在通过该函数类型实现接口,并将该函数类型的实例化对象赋值给接口变量,这样就可以通过接口变量来调用函数类型实现的接口功能。


相关文章
|
4天前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
4天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
7天前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
11 3
|
12天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
39 7
|
21天前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
2月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
30 7
|
23天前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化
|
2月前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
2月前
|
编译器 Go C++
Go to Learn Go之函数
Go to Learn Go之函数
25 0
|
2月前
|
编译器 Go 索引
Go数组、多维数组和切片(动态数组),及常用函数len(),cap(),copy(),append()在切片中的使用
本文介绍了Go语言中数组、多维数组和切片(动态数组)的基本概念和操作,包括数组的定义、初始化、访问,多维数组的定义和访问,以及切片的创建、使用和扩容。同时,还讲解了切片中常用的函数len()、cap()、copy()和append()的使用方法。