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 = 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语句
阅读 448
Go先锋
 
 
 
 
 
posted @   技术颜良  阅读(327)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2021-09-02 在 Kubernetes 集群中如何部署 frpc
点击右上角即可分享
微信分享提示