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 Handlerh = printName
这样 printName 实现了 Handler 接口。
3
三、通过接口调用函数
有了接口之后,就可以通过接口变量调用函数:
h.Handle("Bob") // 调用printName输出Hello Bob实际上是通过接口 h 调用了函数 printName。
4
四、不同函数实现同一接口
不同的函数也可以实现同一接口:
func echoName(name string) {fmt.Println(name)}h = echoNameh.Handle("Alice") // 通过echoName输出Alice
只要参数和返回值匹配,都可以作为接口实现。
5
五、函数带接收者也可以实现接口
定义在类型上的方法函数也可以实现接口:
type MyString stringfunc (s MyString) Print() {fmt.Println(s)}var h Handlerh = MyString.Printh.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 Handlerh = func(name string) {fmt.Println(name)}
9
九、类型安全需要检查
函数实现接口时,需要自己校验参数和返回值。
// 接口定义type Handler interface {Handle(string)}// 这个函数参数不匹配func handle(name int) {}// 使用时需要检查类型var h Handlerh = handle // 编译错误,参数类型不匹配
10
十、错误处理需要额外代码
函数实现接口时,需要额外处理错误。
type Handler interface {Handle(string)}func process(name string) error {// ...return err}h := processerr := h.Handle("Bob") // 需要处理错误
11
总结
通过函数实现接口,可以编写非常灵活的代码。合理使用可以减少冗余,提高可扩展性。
收录于合集 #Go语言函数
 19个上一篇Go语言闭包不打烊,让你长见识!下一篇Go语言编程的一大杀器!详解defer语句
Go先锋
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号