• go编程中接口(interface)用法


    1、编程中多态的概念                                                                 

          如果熟悉C++编程,就会知道C++中可以通过虚函数来实现多态 ,Java等面向对象的语言也有类似的特性。那么是多态呢?

    多态是面向对象编程中的一个基本概念,允许不同的类通过相同的接口实现不同的功能。简而言之,多态使得一个接口可以有多个实现,从而可以处理不同类型的对象,而无需知道它们的具体类型。

    在 Go 语言中,多态主要通过接口实现。接口定义了一组方法,而不同的类型可以实现这些方法,从而实现接口。这样,可以使用接口类型的变量来引用实现了该接口的不同类型的对象。

                                                                                                                            --from chatGPT

    多态是面向对象编程的一个概念,其核心相同的接口,具有不同的实现,从而达到调用相同的接口实现不同的功能。

    (go语言由于没有这个概念,所以严格来讲,go中接口不能算是多态,但是核心思想是一样的。)

    2、interface概念

            前面已经提到,go interface其实就是与多态相关的一个概念。

    Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

    接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。

    Go 语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有方法,那么它就自动地实现了该接口。因此,我们可以通过将接口作为参数来实现对不同类型的调用,从而实现多态。

                                                                                                                    -- from 菜鸟教程

    3、用法举例

    3.1 最简单的demo

    为了让初学者有一个最直观的认识,先看一个最简单的demo:

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. // 定义一个接口,里面包含一个area方法
    6. // 这里起始也可以包含多个方法
    7. type Shape interface {
    8. area() float64
    9. }
    10. // 定义长方形结构体
    11. type Rectangle struct {
    12. width float64
    13. height float64
    14. }
    15. // 实现长方形结构体的area方法
    16. func (r Rectangle) area() float64 {
    17. return r.width * r.height
    18. }
    19. // 定义圆结构体
    20. type Circle struct {
    21. radius float64
    22. }
    23. // 实现圆的area方法
    24. func (c Circle) area() float64 {
    25. return 3.14 * c.radius * c.radius
    26. }
    27. func main() {
    28. // 定义一个接口变量
    29. var shape Shape
    30. // 下面这个赋值语句才体现了interface的特性
    31. // 注意到,shape是一个interface,但是却可以将一个Rectangle结构体类型复制给它
    32. shape = Rectangle{width: 10, height: 5}
    33. fmt.Printf("矩形面积: %f\n", shape.area())
    34. shape = Circle{radius: 3}
    35. fmt.Printf("圆形面积: %f\n", shape.area())
    36. }

    输出结果如下:

    矩形面积: 50.000000
    圆形面积: 28.260000

    从上面可以看到,同一个接口方法area,由于不同的结构体具有不同的实现,从而不同的结构体对象调用同一个方法时,表现出各自的功能。

    3.2 比较贴近实际业务案例

            在处理实际业务时,我们可能会根据接收到不同的消息,从而自动调用相关的方法进行处理。为此,我们需要先将不同的接口实现方法进行注册,然后根据不同的消息进行处理。

    1. package main
    2. import "fmt"
    3. type Shape interface {
    4. area() float64
    5. }
    6. type Rectangle struct {
    7. width float64
    8. height float64
    9. }
    10. func (r Rectangle) area() float64 {
    11. return r.width * r.height
    12. }
    13. type Circle struct {
    14. radius float64
    15. }
    16. func (c Circle) area() float64 {
    17. return 3.14 * c.radius * c.radius
    18. }
    19. type Registry struct {
    20. shape map[int]Shape
    21. }
    22. // 创建一个新的注册器
    23. func NewRegistry() *Registry {
    24. return &Registry{shape: make(map[int]Shape)}
    25. }
    26. // 注册处理函数
    27. func (r *Registry) Register(id int, shape Shape) {
    28. r.shape[id] = shape
    29. }
    30. func (r *Registry) Get(id int) Shape {
    31. return r.shape[id]
    32. }
    33. // 定义不同的消息ID
    34. const (
    35. MSG_UNKNOW = 0
    36. MSG_RECTANGLE = 1
    37. MSG_CIRCLE = 2
    38. )
    39. func main() {
    40. //var s Shape
    41. registry := NewRegistry()
    42. // 注册不同的方法,将结构体类型与消息ID绑定,从而根据不同的消息ID调用不同的方法
    43. // 下面这个注册函数体现了interface的精髓
    44. // Register函数第二个入参是一个Shape类型的interface,可以传入Circle或Rectangle结构体类型实参
    45. registry.Register(MSG_CIRCLE, Circle{radius: 3})
    46. registry.Register(MSG_RECTANGLE, Rectangle{width: 10, height: 5})
    47. var msgId int
    48. // 假如收到的消息id为MSG_RECTANGLE
    49. msgId = MSG_RECTANGLE
    50. r := registry.Get(msgId)
    51. fmt.Printf("面积: %f\n", r.area())
    52. }

    参考资料:

    【1】Go 语言接口 | 菜鸟教程

  • 相关阅读:
    这 30 个常用的 Maven 命令你必须熟悉!
    Spring精讲:什么是BeanFactory?(附源码)
    Ansible --- playbook 剧本
    NumPY创建数组(ndarray)对象方法应用
    设计模式--责任链模式
    后端工程师的前端之路系列--小程序学习
    用云服务器构建gpt和stable-diffusion大模型
    关于安卓api、implementation、compile的区别
    申请实用新型专利需要的时间
    ATJ2157内存篇【炬芯音频芯片】---sct语法
  • 原文地址:https://blog.csdn.net/weixin_43354152/article/details/139815979