《Go 语言第一课》课程学习笔记(四)

news/2024/11/17 22:37:35/

构建模式:Go Module 的 6 类常规操作

为当前 module 添加一个依赖

  • 我们如何为一个 Go Module 添加一个新的依赖包呢?
    • 如果我们要为项目增加一个新依赖:github.com/google/uuid,我们首先会更新源码:
      package mainimport ("fmt""github.com/google/uuid""github.com/sirupsen/logrus"
      )func main() {fmt.Println("hello, world")logrus.Println(uuid.NewString())
      }
      
    • 新源码中,我们通过 import 语句导入了 github.com/google/uuid,并在 main 函数中调用了 uuid 包的函数 NewString。
    • 此时,如果我们直接构建这个 module,我们会得到一个错误提示:
      could not import github.com/google/uuid (no required module provides package "github.com/google/uuid")
      could not import github.com/sirupsen/logrus (no required module provides package "github.com/sirupsen/logrus")
      
  • 我们可以使用 go mod tidy 命令,在执行构建前自动分析源码中的依赖变化,识别新增依赖项并下载它们:
    在这里插入图片描述

升级 / 降级依赖的版本

  • 在实际开发工作中,如果我们认为 Go 命令自动帮我们确定的某个依赖的版本存在一些问题,比如,引入了不必要复杂性导致可靠性下降、性能回退等等,我们可以手工将它降级为之前发布的某个兼容版本。
  • Go Module 的版本号采用了语义版本规范,也就是版本号使用 vX.Y.Z 的格式。
    • 其中 X 是主版本号,Y 为次版本号 (minor),Z 为补丁版本号 (patch)。
    • 主版本号相同的两个版本,较新的版本是兼容旧版本的。
    • 如果主版本号不同,那么两个版本是不兼容的。
  • 我们可以在项目的 module 根目录下,执行带有版本号的 go get 命令下载指定的低版本依赖包:go get github.com/sirupsen/logrus@v1.7.0,我们可以使用与降级同样的步骤来完成升级。

添加一个主版本号大于 1 的依赖

  • 语义导入版本机制有一个原则:如果新旧版本的包使用相同的导入路径,那么新包与旧包是兼容的。也就是说,如果新旧两个包不兼容,那么我们就应该采用不同的导入路径。
  • 如果我们要为 Go 项目添加主版本号大于 1 的依赖,我们就需要使用“语义导入版本”机制,在声明它的导入路径的基础上,加上版本号信息。

移除一个依赖

  • 第一想法是删除掉代码中对包导入的这一行,之后再利用 go build 命令成功地构建这个项目。与添加一个依赖时 Go 命令给出友好提示不同,这次 go build 没有给出任何关于项目已经将包依赖删除的提示,并且 go.mod 里 require 段中的依赖依旧存在着。
  • 其实,要想彻底从项目中移除 go.mod 中的依赖项,仅从源码中删除对依赖项的导入语句还不够。这是因为如果源码满足成功构建的条件,go build 命令是不会“多管闲事”地清理 go.mod 中多余的依赖项的。
  • 那正确的做法是怎样的呢?我们还得用 go mod tidy 命令,将这个依赖项彻底从 Go Module 构建上下文中清除掉。go mod tidy 会自动分析源码依赖,而且将不再使用的依赖从 go.mod 和 go.sum 中移除。

重要场景

  • 通过 go get 我们可以升级或降级某依赖的版本,如果升级或降级前后的版本不兼容,这里千万注意别忘了变化包导入路径中的版本号,这是 Go 语义导入版本机制的要求。
  • 通过 go mod tidy,我们可以自动分析 Go 源码的依赖变更,包括依赖的新增、版本变更以及删除,并更新 go.mod 中的依赖信息。
  • 通过 go mod vendor,我们依旧可以支持 vendor 机制,并且可以对 vendor 目录下缓存的依赖包进行自动管理。

http://www.ppmy.cn/news/1041548.html

相关文章

KVM虚拟机管理

1、创建、删除快照 关机 init0 列出快照 删除快照 2、虚拟机迁移 报错 解决:关闭防火墙,关闭selinux 其他解决办法:kvm热迁移使用nfs共享存储报错_莉法的博客-CSDN博客

ReentrantLock源码解析

定义 可重入锁,对于同一个线程可以重复获得此锁。分为FailLock和NonfairLock。 加锁就是将exclusiveOwnerThread设置为当前线程,且将status加一,解锁就status-1,且exclusiveOwnerThread设置为null。 公平锁:根据先来后…

Python 网页解析初级篇:BeautifulSoup库的入门使用

在Python的网络爬虫中,网页解析是一项重要的技术。而在众多的网页解析库中,BeautifulSoup库凭借其简单易用而广受欢迎。在本篇文章中,我们将学习BeautifulSoup库的基本用法。 一、BeautifulSoup的安装与基本使用 首先,我们需要使…

对象存储服务-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务,适合存储非结构化数据,如图片,音频,视频,日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…

vue使用jsplumb 流程图

安装jsPlumb库&#xff1a;在Vue项目中使用npm或yarn安装jsPlumb库。 npm install jsplumb 创建一个Vue组件&#xff1a;创建一个Vue组件来容纳jsPlumb的功能和呈现。 <template><div style"margin: 20px"><div style"margin: 20px">&l…

js 闭包和 垃圾回收机制

js 闭包和 垃圾回收机制 闭包里面的变量 是局部变量 但是 由于一直使用&#xff0c;引用&#xff0c;没有被回收 所以相当于 全局变量

CentOS系统环境搭建(五)——Centos7安装maven

centos系统环境搭建专栏&#x1f517;点击跳转 Centos7安装maven 下载压缩包 maven下载官网 解压 压缩包放置到/usr/local tar -xvf apache-maven-3.9.2-bin.tar.gz配置环境变量 vim /etc/profile在最下面追加 MAVEN_HOME/usr/local/apache-maven-3.9.2 export PATH${MAV…

谷歌云 | 最大限度地提高可靠性降低成本:调整 Kubernetes 工作负载的大小

【Cloud Ace 是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。】 您知道通过调整…