Go实现共享库的方法

 更新时间:2023年02月24日 08:53:46   作者:小雄Ya  
本文主要介绍了Go实现共享库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Don't Repeat Yourself 不要重复自己,这是软件开发的一个基本原则,目的就是减少重复。但是在系统中不同的部分,可能会有不同的业务逻辑,若使用相同的功能来解决不同上下文中的问题,那应该使用公共方法来防止代码重复吗?

共享库

使用共享库可以协助我们管理代码重用的问题,但是需要考虑共享库依赖和变更控制的问题。

如果有几个服务都使用了一个共享库:

  • 共享库发生变更,每个服务都需要使用新版本共享库。旧版本的共享库如果被弃用就会导致服务不可使用,所以在这种情况下,每次发生变更时就需要重新测试和重新部署服务。
  • 服务发生变更就需要更改共享库,这样共享库就失去通用性的特征。说明共享库包含服务相关的服务的业务逻辑。但这样是错误的,共享库不应该与服务有任何关联的代码块

如果有几个服务都有使用多个共享库:

不同的服务使用不同的库,依赖多个库。共享库越多,依赖就越多,就会导致依赖管理变得困难。

创建库

以Go 操作 RabbitMQ 创建一个共享库为例子,需要初始化 MQ实例,创建连接,重连机制、关闭,消费者通道,创建队列,队列绑定交换机等等功能。

type RabbitMQ struct {
    connection   *amqp.Connection
    channel      *amqp.Channel
    connURL      string
    errCh        <-chan *amqp.Error
    messageChan  <-chan amqp.Delivery
    retryAttempt int
}

// 初始化 MQ 实例
func NewRabbitMQ(options RabbitMQOptions) (*RabbitMQ, error) {
    rabbitMQ := &RabbitMQ{
        connURL:      options.URL,
        retryAttempt: options.RetryAttempt,
    }

    if err := rabbitMQ.connect(); err != nil {
        return nil, err
    }

    return rabbitMQ, nil
}


func (rmq *RabbitMQ) connect() error {}
func (rmq *RabbitMQ) reconnect() {}
func (rmq *RabbitMQ) Close() {}
func (rmq *RabbitMQ) ConsumeMessageChannel() (jsonBytes []byte, err error) {
func (rmq *RabbitMQ) CreateQueue(name string, durable bool, autoDelete bool, exclusive bool, noWait bool, args map[string]interface{}) (amqp.Queue, error) }

创建完之后需要再创建一个合适的标签 tag 或版本号来共享该代码。使用过 github 都可以在 release 中看到版本号和 tag 。

使用库

首先,我们需要使用 go get 安装这个共享库。 之后,我们必须在我们的项目中导入我们的库,如下所示。

package main

import (
    "fmt"
    rabbitmq_sdk "github.com/nanlv/rabbitmq-sdk"
)

func main() {
    fmt.Println("connect MQ")

    options := rabbitmq_sdk.RabbitMQOptions{
        URL:          "amqp://root:root@localhost:5672/",
        RetryAttempt: 5,
    }

    rabbitMQ, err := rabbitmq_sdk.NewRabbitMQ(options)
    if err != nil {
        return
    }

    queue, err := rabbitMQ.CreateQueue("queue1", true, true, false, false, nil)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
}

如果你想测试你的库而不发布它,你可以使用 replace 指令。 将依赖库的地址指向本地的文件的地址。

replace github.com/nanlv/rabbitmq-sdk v1.0.0 => 项目在本地的地址

总结

若两个部分使用相同的库可能会增加依赖和耦合。因为它们具有不同的业务逻辑,在业务独立演进时,就会增加耦合和维护成本。耦合是衡量两个组件间了解和互相依赖程度的指标。耦合度越高,依赖性越高。

共享库可以解决代码重复的问题。但需要做好版本管理和变更控制。使用 Go 可以创建一个共享库然后上传到 github。就可以将其作为一个共享库使用。

到此这篇关于Go实现共享库的方法的文章就介绍到这了,更多相关Go 共享库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中的[]byte与16进制(String)之间的转换方式

    Golang中的[]byte与16进制(String)之间的转换方式

    这篇文章主要介绍了Golang中的[]byte与16进制(String)之间的转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Go语言实现管理多个数据库连接

    Go语言实现管理多个数据库连接

    在软件开发过程中,使用 MySQL、PostgreSQL 或其他数据库是很常见的,由于配置和要求不同,管理这些连接可能具有挑战性,下面就来和大家聊聊如何在Go中管理多个数据库连接吧
    2023-10-10
  • 分享6个Go处理字符串的技巧小结

    分享6个Go处理字符串的技巧小结

    这篇文章主要介绍了分享6个Go处理字符串的技巧小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • golang实现枚举的几种方式

    golang实现枚举的几种方式

    在Go语言中,虽没有内置枚举类型,但可通过常量、结构体或自定义类型和方法实现枚举功能,这些方法提高了代码的可读性和维护性,避免了魔法数字的使用,感兴趣的可以了解一下
    2024-09-09
  • Go语言中的上下文取消操作详解

    Go语言中的上下文取消操作详解

    这篇文章主要给大家介绍了关于Go语言中上下文取消操作的相关资料,本文将解释我们如何利用上下文库的取消特性,并通过一些模式和最佳实践来使用取消,使你的程序更快、更健壮。需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • Go Interface接口初学者手册

    Go Interface接口初学者手册

    这篇文章主要为大家介绍了Go Interface接口的基础用法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 详解如何使用Go的Viper来解析配置信息

    详解如何使用Go的Viper来解析配置信息

    Viper库为Golang语言开发者提供了对不同数据源和不同格式的配置文件的读取,是Go项目读取配置的神器,我们今天就来讲讲如何使用Viper来解析配置信息,文中通过代码示例讲解非常详细,需要的朋友可以参考下
    2024-01-01
  • 浅谈Go语言中字符串和数组

    浅谈Go语言中字符串和数组

    这篇文章主要简单介绍了Go语言中字符串和数组的使用方法和申明方式,需要的朋友可以参考下
    2015-01-01
  • Go结构体的基本使用详解

    Go结构体的基本使用详解

    本文主要介绍了Go结构体的基本使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 探索分析Go HTTP GET请求发送body

    探索分析Go HTTP GET请求发送body

    这篇文章主要为大家介绍了探索分析Go HTTP GET请求发送body,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论