Go语言函数实现接口的N个实践技巧
Go语言函数实现接口的N个实践技巧
Go 先锋
读完需要
4分钟速读仅需 2 分钟
/ Go 语言函数类型实现接口手册 /
函数是 Go 语言中非常重要的类型,它也可以直接实现接口,这为我们提供了一种更简洁优雅的编程方式。本文将剖析 Go 语言中的函数类型如何实现接口。本文主要内容如下
接口定义
函数实现接口
通过接口调用函数
不同函数实现同一接口
函数带接收者也可以实现接口
空接口实现
回调函数场景
解耦和扩展性好
类型安全需要检查
错误处理需要额外代码
1
一、接口定义
定义一个函数类型的接口:
type Handler interface {
Handle(name string)
}
Handler 接口包含一个字符串参数的 Handle 方法。
2
二、函数实现接口
定义一个普通函数:
func printName(name string) {
fmt.Println("Hello ", name)
}
可以直接将其赋值给 Handler 接口:
var h Handler
h = printName
这样 printName 实现了 Handler 接口。
3
三、通过接口调用函数
有了接口之后,就可以通过接口变量调用函数:
h.Handle("Bob") // 调用printName输出Hello Bob
实际上是通过接口 h 调用了函数 printName。
4
四、不同函数实现同一接口
不同的函数也可以实现同一接口:
func echoName(name string) {
fmt.Println(name)
}
h = echoName
h.Handle("Alice") // 通过echoName输出Alice
只要参数和返回值匹配,都可以作为接口实现。
5
五、函数带接收者也可以实现接口
定义在类型上的方法函数也可以实现接口:
type MyString string
func (s MyString) Print() {
fmt.Println(s)
}
var h Handler
h = MyString.Print
h.Handle("hello") // 输出hello
6
六、空接口实现
任意类型都实现了空接口 interface{}:
func add(a, b int) int {
return a + b
}
var obj interface{}
obj = add
add 函数实现了空接口。
7
七、回调函数场景
函数实现接口非常适合回调函数场景:
type Callback func(s string)
func process(cb Callback) {
cb("Hello")
}
process(func(s string){
fmt.Println(s)
})
回调函数直接作为参数传入 process。
8
八、解耦和扩展性好
函数实现接口可以减少接口的额外封装,解耦同时提高扩展性。
// 不使用函数实现接口,需要定义新的类型
type Printer struct {
name string
}
func (p *Printer) Print() {
fmt.Println(p.name)
}
// 使用函数实现接口,不需要额外定义
var h Handler
h = func(name string) {
fmt.Println(name)
}
9
九、类型安全需要检查
函数实现接口时,需要自己校验参数和返回值。
// 接口定义
type Handler interface {
Handle(string)
}
// 这个函数参数不匹配
func handle(name int) {
}
// 使用时需要检查类型
var h Handler
h = handle // 编译错误,参数类型不匹配
10
十、错误处理需要额外代码
函数实现接口时,需要额外处理错误。
type Handler interface {
Handle(string)
}
func process(name string) error {
// ...
return err
}
h := process
err := h.Handle("Bob") // 需要处理错误
11
总结
通过函数实现接口,可以编写非常灵活的代码。合理使用可以减少冗余,提高可扩展性。
收录于合集 #Go语言函数
19个上一篇Go语言闭包不打烊,让你长见识!下一篇Go语言编程的一大杀器!详解defer语句
Go先锋