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

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

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

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

  1. 接口定义
  2. 函数实现接口
  3. 通过接口调用函数
  4. 不同函数实现同一接口
  5. 函数带接收者也可以实现接口
  6. 空接口实现
  7. 回调函数场景
  8. 解耦和扩展性好
  9. 类型安全需要检查
  10. 错误处理需要额外代码

1

 

一、接口定义

定义一个函数类型的接口:

type Handler interface {
  Handle(name string)
}

    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

     

    总结

    通过函数实现接口,可以编写非常灵活的代码。合理使用可以减少冗余,提高可扩展性。


      目录
      相关文章
      |
      15天前
      |
      存储 监控 算法
      员工上网行为监控中的Go语言算法:布隆过滤器的应用
      在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
      58 8
      员工上网行为监控中的Go语言算法:布隆过滤器的应用
      |
      1月前
      |
      存储 Go 索引
      go语言中数组和切片
      go语言中数组和切片
      42 7
      |
      1月前
      |
      Go 开发工具
      百炼-千问模型通过openai接口构建assistant 等 go语言
      由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
      |
      1月前
      |
      程序员 Go
      go语言中结构体(Struct)
      go语言中结构体(Struct)
      103 71
      |
      1月前
      |
      存储 Go 索引
      go语言中的数组(Array)
      go语言中的数组(Array)
      107 67
      |
      10天前
      |
      算法 安全 Go
      Go 语言中实现 RSA 加解密、签名验证算法
      随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
      46 12
      |
      1月前
      |
      存储 Go
      go语言中映射
      go语言中映射
      38 11
      |
      13天前
      |
      监控 算法 安全
      解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
      企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
      21 0
      |
      27天前
      |
      Go 数据安全/隐私保护 UED
      优化Go语言中的网络连接:设置代理超时参数
      优化Go语言中的网络连接:设置代理超时参数
      go语言函数、方法、闭包(详解)
      go语言函数、方法、闭包(详解)
      下一篇
      开通oss服务