Go语言函数实现接口的N个实践技巧

Go语言函数实现接口的N个实践技巧


Go 先锋

读完需要

4分钟

速读仅需 2 分钟

/ Go 语言函数类型实现接口手册 /

函数是 Go 语言中非常重要的类型,它也可以直接实现接口,这为我们提供了一种更简洁优雅的编程方式。本文将剖析 Go 语言中的函数类型如何实现接口。本文主要内容如下

  1. 接口定义

  2. 函数实现接口

  3. 通过接口调用函数

  4. 不同函数实现同一接口

  5. 函数带接收者也可以实现接口

  6. 空接口实现

  7. 回调函数场景

  8. 解耦和扩展性好

  9. 类型安全需要检查

  10. 错误处理需要额外代码

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 = echoNameh.Handle("Alice") // 通过echoName输出Alice

只要参数和返回值匹配,都可以作为接口实现。

5

   

五、函数带接收者也可以实现接口

定义在类型上的方法函数也可以实现接口:

type MyString string
func (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 Handler h = 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语句
阅读 448
Go先锋
 
 
 
 
 
posted @ 2023-09-02 17:44  技术颜良  阅读(252)  评论(0编辑  收藏  举报