「go module」一文总结 go mod 入门使用

文章目录

  • 什么是 Go Modules
  • 为什么要使用 Modules
  • 怎么使用
    • 前置条件
    • 项目初始化
    • 如何安装/管理依赖?
      • 依赖安装 go get
      • 版本选择方式
    • 替换版本 replace
    • 间接依赖 && go mod tidy
    • 远程代理
  • 总结

什么是 Go Modules

Module 是 Go 的依赖管理工具。

核心概念

  • Modules 模块
    定义:简易来说,go.mod 文件所处的根目录即为模块,一个 modules 中包含了多个 package。
  • Package 包
    一个文件夹下的多个 go 文件构成了一个包,每个文件顶部都有 package xxx 的声明文件所属的包
  • Version 版本
    一个版本标识模块的一个不可变快照,每个版本以 v 开头。版本包括 主版本号、次版本号、补丁版本号等。
    在 Go Modules 中,每次创建一个大版本,必须创建一个新的子目录。如 github.com/pelletier/go-toml/v2

为什么要使用 Modules

简单来说,go Modules 大势所趋。

从历史来说,在 Modules 之前,使用 vendor进行包管理。vendor 的管理方式非常简单, 将项目的所有依赖项复制到本项目的 vendor 目录下,需要时首先从 vendor 目录中寻找。

vendor 的缺点非常明显,当你将依赖下载到 vendor 目录下时,是无法指定版本的,而且你也很难感知到自己所下载的依赖版本。

Modules 提供的一个核心能力就是对依赖版本的管理。

怎么使用

前置条件

  • go 版本 >= 1.11

  • 设置 GO111MODULE && go proxy
    go env -w GO111MODULE=on
    go env -w GOPROXY=https://goproxy.cn,direct

开启 go111Module 之后,go 会在 modules 根目录下找依赖,而不会去 gopath 中找,当前默认值时auto。

项目初始化

go mod init 初始化一个模块,该命令生成一个 go mod 文件,管理依赖项。

如何安装/管理依赖?

依赖安装 go get

go get 命令下载、编译、安装,命令如下

go get dependenct@version

go get 会将依赖安装到 $gopath/pkg/mod,可以通过@指定版本号

同时,go get 还可以对依赖进行更新,命令如下

	go get -u dependece

使用上述 go get 命令时,go modules 会自动更新 go.mod记录新的依赖项。

版本选择方式

安装依赖时,对版本的选择有多种方式:通配符匹配、比较运算符、精确版本。

  • 通配符 ( * )
    • 匹配任意数字或者字符,例如 v1.2.* 可以匹配任意版本
  • 比较版本
    • > 大于某版本
    • >= 大于等于某版本
    • < 小于某版本
    • <= 小于等于某版本
    • != 不等于某版本
    • -:范围 v1.0-v1.3(包含边界)
  • 精确版本
    • 直接使用具体的版本号 v1.2.3

替换版本 replace

go mod repalce module replacement
将 module 替换为 replacement

go mod replace github.com/example/foo v1.2.3
更换版本

go mod replace github.com/example/bar …/some-local-module
更换为本地版本

使用 go mod replace 之后,需要使用 go mod tidy 更新 go mod go sum 文件。

一般是用于测试。其他场景避免使用

间接依赖 && go mod tidy

  1. 直接依赖:直接依赖是您在项目的 go.mod 文件的 require 部分明确列出的依赖项。这些依赖项通常是您在代码中直接导入并使用的模块,它们是您项目直接依赖的模块。

  2. 非直接依赖:非直接依赖是其他模块的依赖项,也就是您项目的直接依赖项所依赖的模块。这些非直接依赖项不会在您项目的 go.mod 文件的 require 部分中列出,而是在其他模块的 require 部分中列出。

go mod tidy 命令是 Go Modules 中的一个命令,用于维护和更新项目的 go.mod 和 go.sum 文件,以保持依赖项的一致性和正确性。

在执行 go mod tidy 命令时,Go 编译器会增加缺失的依赖、删除未使用的直接依赖项、更新直接依赖项的版本、更新 go.sum 文件

远程代理

Go Modules 支持使用远程代理来加速模块的下载和构建过程,简单来说无法直接访问 Go 官网时通过代理进行下载。具体命令

go env -w GOPROXY=https://goproxy.cn,direct

配置完成后,通过 go get、go mod tidy 时,首先使用代理网站下载更新依赖。

总结

我对 Go Modules 的理解,通过 Modules 实现了对依赖的版本控制,所有的依赖默认下载在 $GoPath/pkg/mod 下,Modules 通过 go.mod 文件指明当前项目所使用的依赖及其具体版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/177591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生系列Go语言篇-泛型Part 1

“Don’t Repeat Yourself”是常见的软件工程建议。与其重新创建一个数据结构或函数&#xff0c;不如重用它&#xff0c;因为对重复的代码保持更改同步非常困难。在像 Go 这样的强类型语言中&#xff0c;每个函数参数及每个结构体字段的类型必须在编译时确定。这种严格性使编译…

使用vue脚手架创建vue项目

Vue是一个流行的前端框架&#xff0c;可以用简洁的语法和组件化的思想开发单页面应用。Vue脚手架是一个官方提供的命令行工具&#xff0c;它可以帮你快速搭建和配置vue项目的基本结构和依赖。 本文介绍如何使用vue脚手架创建一个vue2项目&#xff0c;并选择一些常用的功能和插件…

git修改远程地址

你好&#xff01;如果你想在提交时更改项目的提交地址&#xff0c;你可以按照以下步骤进行操作&#xff0c;具体的步骤可能因使用的版本控制工具而异&#xff0c;以下是在Git中的示例&#xff1a; 查看当前远程仓库地址&#xff1a; 使用以下命令查看当前项目的远程仓库地址&am…

Java开源ETL工具-Kettle

一、背景 公司有个基于Kettle二次开发产品主要定位是做一些数据ETL的工作, 所谓的ETL就是针对数据进行抽取、转换以及加载的过程&#xff0c;说白了就是怎么对原始数据进行清洗&#xff0c;最后拿到我们需要的、符合规范的、有价值的数据进行存储或者分析的过程。 一般处理ETL的…

可观测性项目开发与学习ing

http1,2,3的区别 HTTP/1.0、HTTP/1.1、HTTP/2 和 HTTP/3 是不同版本的协议&#xff0c;它们在以下方面有所不同&#xff1a; HTTP/1.0: 是最早的版本&#xff0c;主要特点如下&#xff1a; 每个请求和响应都需要建立一个新的 TCP 连接。不支持持久连接&#xff08;Keep-Alive&…

【从浅识到熟知Linux】基本指令之man、uname和bc

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;干完饭写篇博客放松一下。 文章前言&#xff1a;本文介绍man、uname和bc指令用法并给出示例和截图。 文章目录 man基本语法功能选项无选项…

人工智能入门,什么是AlphaGo式搜索?

AlphaGo式搜索是一种搜索算法&#xff0c;它是由DeepMind开发的AlphaGo团队在开发AlphaGo程序时使用的搜索策略。 AlphaGo是一个基于人工智能的围棋程序&#xff0c;它在2016年击败了世界冠军柯洁&#xff0c;引起了广泛的关注。 AlphaGo式搜索的核心思想是使用蒙特卡洛树搜索…

Docker:深入解析Nexus技术构建可靠的软件仓库管理系统

1、简述 在现代软件开发中&#xff0c;有效的软件仓库管理是确保项目成功的关键一环。Nexus Repository Manager作为一种流行的仓库管理系统&#xff0c;为开发人员提供了强大的工具&#xff0c;用于存储、检索和管理软件构建。本文将深入解析Nexus技术&#xff0c;探讨其关键…

提示词入门

文章目录 提示词入门Prompt Engneering1.更加**明确**且**具体**的指令2. 编写提示词的方法3. 按需设计和迭代思维 提示词入门Prompt Engneering 1.更加明确且具体的指令 eg: 模糊&#xff1a;介绍一下重庆明确且具体&#xff1a;介绍一下重庆适合情侣周末游玩的景点及当地…

力扣:347.前 K 个高频元素

题目&#xff1a; 给定一个非空的整数数组&#xff0c;返回其中出现频率前 k 高的元素。 示例 1: 输入: nums [1,1,1,2,2,3], k 2输出: [1,2] 示例 2: 输入: nums [1], k 1输出: [1] 提示&#xff1a; 你可以假设给定的 k 总是合理的&#xff0c;且 1 ≤ k ≤ 数组中…

HTTPS攻击原理 被攻击该如何防护

简单来说&#xff0c;HTTPS HTTP SSL/TLS。 在 HTTP 协议中&#xff0c;客户端通过网络传输消息与服务器进行通信。但该消息采用明文的原始格式。坏人&#xff08;攻击者&#xff09;很容易窃听消息。这就是我们需要 SSL/TLS 的原因。 HTTPS是一种安全的HTTP协议&#xff0c…

天外飞仙,菠萝蜜多斩,灵犀双响炮。。。linux通信之UDP通信

任务: 利用UDP实现基本通信 思路: 1.服务器实现:socket bind recvfrom sendto 2.客户端实现:socket sendto recvfrom //服务器 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h>…

OMP: Error #15: Initializing libiomp5md.dll

问题描述 在conda虚拟环境运行程序时&#xff0c;出现以下的错误&#xff1a; 问题原因 anaconda的环境下存在两个libiomp5md.dll文件。 解决方法 一、在代码上加上限制&#xff08;每次都得加&#xff09; import os os.environ[KMP_DUPLICATE_LIB_OK]True 这种方法解决不…

【蓝桥杯选拔赛真题26】C++字符串逆序 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++字符串逆序 一、题目要求 1、编程实现 2、输入输出 二、算法分析

FreeRTOS-信号量

信号量 信号&#xff1a;起通知作用。 量&#xff1a;表示资源的数量。 当量没有限制时&#xff0c;就是计数型信号量。 当量只有0、1时&#xff0c;就是二进制信号量。 支持的动作&#xff1a;give给出资源&#xff0c;计数值1&#xff1b;take获得资源&#xff0c;计数值-1。…

Charles下载安装及配置之Mac

因工作需要用到抓包工具&#xff0c;但Fiddler不能在mac上使用&#xff0c;所以找到了Charles&#xff0c;Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到…

sql注入靶场

第一关&#xff1a; 输入&#xff1a;http://127.0.0.1/sqli-labs-master/Less-1/?id1 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27-- 使用--来闭合单引号&#xff0c;证明此处存在字符型的SQL注入。 使用order …

Unity之NetCode多人网络游戏联机对战教程(10)--玩家动画同步

文章目录 前言NetworkAnimation服务端权威客户端权威 前言 这次的动画同步与位置同步&#xff0c;可以说实现思路是一样的&#xff0c;代码相似度也非常高 NetworkAnimation 如果直接挂载这个脚本只有Host&#xff08;服务端&#xff09;才可以同步&#xff0c;Client是没有…

通过火狐Firefox浏览器在设备间留言、传递备注消息

如果多台设备间没有都安装微信、飞书这种可以通过文件传输助手备注消息的APP&#xff0c;那么可通过火狐浏览器在设备间留言。 原理&#xff1a;火狐支持把当前设备的一个浏览器标签页发送到其他设备 那么我们只需要把要留言的文本记录到一个网页&#xff0c;然后发送到其他设…

grpc 集成 opentelemetry

服务端代码&#xff1a; package mainimport ("context""flag""fmt""go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute""go.opentelemetry.io/otel/exporters/jaeger""go.opentelemetry.io/o…