2019年11月7日 Go生态洞察:Go Modules v2及更高版本
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁
🦄 博客首页——🐅🐾猫头虎的博客🎐
🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》 🐅 学会Golang语言,畅玩云原生,走遍大小厂~💐
🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
☁️🐳
Go语言开发者必备技术栈☸️:
🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥

文章目录
- 🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
- 2019年11月7日 Go生态洞察:Go Modules v2及更高版本 🚀
- 摘要
- 引言
- 正文
- Go Modules的重大版本和模块路径 🛣️
- 发布v2及更高版本 🌟
- 维护多个主要版本 🛠️
- 总结
- 下一篇预告
- 原创声明
-
原创作者: 猫头虎
-
作者wx: Libin9iOak
-
作者公众号: 猫头虎技术团队

2019年11月7日 Go生态洞察:Go Modules v2及更高版本 🚀
摘要
大家好,我是猫头虎博主!今天,我们将深入探讨Go的一个关键话题:Go Modules的v2版本及其后续版本。如果你对Go生态的未来方向感到好奇,那就跟着我一起探索吧!搜索关键词包括Go Modules、版本控制、模块兼容性等。
引言
本文是系列博客的第四部分,旨在探讨Go Modules在版本2及以后的发展。对于一个成功的项目而言,随着需求的增加,有时过去的特性和设计决策可能不再适用。这就需要开发者通过删除废弃的函数、重命名类型或拆分复杂的包来整合他们学到的经验。这些变化需要下游用户投入精力迁移他们的代码到新的API,因此在做出这些改变前,应该仔细权衡利弊。
正文
Go Modules的重大版本和模块路径 🛣️
Go Modules确立了Go中一个重要原则——导入兼容规则:
如果一个旧包和一个新包有相同的导入路径, 那么新包必须与旧包向后兼容。
根据定义,一个包的新主要版本与前一个版本不兼容。这意味着新的主要版本的模块必须有一个与前一个版本不同的模块路径。从v2开始,主要版本号必须出现在模块路径的末尾(在go.mod文件中的module语句中声明)。例如,github.com/googleapis/gax-go的作者在开发v2时,使用了新的模块路径github.com/googleapis/gax-go/v2。想要使用v2的用户必须更改他们的包导入和模块需求为github.com/googleapis/gax-go/v2。
发布v2及更高版本 🌟
以下是使用github.com/googleapis/gax-go作为示例的发布过程:
$ pwd
/tmp/gax-go
$ ls
...
$ cat go.mod
module github.com/googleapis/gax-go
...
为了开始github.com/googleapis/gax-go的v2开发,我们创建一个新的v2/目录并将包复制进去:
$ mkdir v2
$ cp -v *.go v2
...
接下来,通过复制当前的go.mod文件并添加/v2后缀来创建v2的go.mod文件:
$ cp go.mod v2/go.mod
$ go mod edit -module github.com/googleapis/gax-go/v2 v2/go.mod
请注意,v2版本被视为与v0 / v1版本不同的单独模块:两者可以在同一构建中共存。因此,如果你的v2+模块有多个包,你应该更新它们以使用新的/v2导入路径。
维护多个主要版本 🛠️
一旦我们对v2 API感到满意,并确信不需要其他重大更改,我们可以标记v2.0.0:
$ git tag v2.0.0
$ git push origin v2.0.0
此时,我们需要维护两个主要版本。向后兼容的更改和bug修复将导致新的次要和补丁版本的发布(例如,v1.1.0、v2.0.1等)。
总结
重大版本的变化导致了开发和维护的开销,并且要求下游用户投资以迁移到新版本。对于大型项目,这些开销往往更大。重大版本的变化只应在识别到一个有说服力的理由后进行。一旦确定了一个突破性变化的有力理由,我们建议在master分支上开发多个主要版本,因为它与更广泛的现有工具兼容。
v1+模块的重大更改应始终在新的vN+1模块中进行。新模块的发布意味着维护者和需要迁移到新包的用户的额外工作。因此,维护者在进行稳定版本发布之前,应该验证他们的API,并仔细考虑在v1之后是否真的需要重大更改。
本文被猫头虎的Go生态洞察专栏收录,详情点击这里。
| 关键知识点 | 描述 |
|---|---|
| Go Modules | Go的模块管理系统 |
| 版本控制 | 管理不同版本的策略和实践 |
| 导入兼容规则 | Go中确保向后兼容性的原则 |
| v2及更高版本 | 管理和发布Go Modules的新版本 |
| 维护多版本 | 同时维护多个版本的策略 |
下一篇预告
下次,我们将探讨Go的另一个里程碑:《Go Turns 10》。届时,我们将回顾Go语言的十年发展历程,探讨其影响力和未来趋势。不要错过!🎉

原创声明
======= ·
-
原创作者: 猫头虎
-
作者wx: Libin9iOak

-
作者公众号: 猫头虎技术团队

| 学习 | 复习 | Go生态 |
|---|---|---|
| ✔ | ✔ | ✔ |
本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。
作者保证信息真实可靠,但不对准确性和完整性承担责任。
未经许可,禁止商业用途。
如有疑问或建议,请联系作者。
感谢您的支持与尊重。
点击
下方名片,加入IT技术核心学习团队。一起探索科技的未来,洞察Go生态,共同成长。
相关文章:
2019年11月7日 Go生态洞察:Go Modules v2及更高版本
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
vue3通过provide和inject实现多层级组件通信
父组件 <template><div><h1>我是父组件 {{num}}</h1><hr><child></child></div> </template><script setup> import child from ./child.vue; import { ref,provide } from vue; let num ref(520) provide(pare…...
【Java学习笔记】72 - 满汉楼 - 餐饮管理系统
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter26 一、需求说明 满汉楼项目功能多,界面复杂,涉及到复杂的awt和swing技术和事件编程,做如下调整: 1.去掉界面和事件处理(工作中使用很少),使…...
【我的创作纪念日】
机缘 大家好,我是圥忈ゼ, 2023 年 07 月 20 日,我撰写了第 1 篇技术博客:《我的编程未来规划》,也是由于我高考后的专业选择,和就业方向的选择,加上想立志成为一名专业 IT 作者,我结…...
车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体)
车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都…...
使用Pytorch从零开始构建Energy-based Model
知识回顾: [1] 生成式建模概述 [2] Transformer I,Transformer II [3] 变分自编码器 [4] 生成对抗网络,高级生成对抗网络 I,高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II 在本教程中…...
基于C#实现梳排序
为什么取名为梳,可能每个梳都有自己的 gap 吧,大梳子 gap 大一点,小梳子 gap 小一点。上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化。 …...
盘点72个Android系统源码安卓爱好者不容错过
盘点72个Android系统源码安卓爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1qiWeLjF2i4dlgmTYgPPSvw?pwd8888 提取码:8888 项目名称 A keyboardlisten…...
nodejs+vue+elementui足球篮球联赛系统
系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统,管理员可以对个人中心、用户管理、赛事信息管理、球队信息管理、球员信息管理、比赛分值板管理、系统管理等进行添加、查询、修改、删除,以保障足球联赛管理系统的正常运行。…...
18.Oracle的过程和函数
oracle11g的过程和函数 一、过程(Procedure)1、子程序2、过程的相关语法 二、函数(Function)1、函数的概念2、函数的创建3、 案例 在Oracle数据库中,过程和函数都是用来封装一系列SQL语句和逻辑操作的数据库对象&#…...
A JSONObject text must begin with ‘{‘ at 1 [character 2 line 1]
今天调用一个接口,返回的是json数据,但是拿到数据进行转换的报错, JSONObject resultJson new JSONObject(resuStr);报错信息是: Exception in thread "main" org.json.JSONException: A JSONObject text must begin …...
C#中openFileDialog控件的使用方法
目录 一、OpenFileDialog基本属性 二、使用 OpenFile 从筛选的选择中打开文件 1.示例源码 2.生成效果 3. 其它示例 三、使用 StreamReader 以流的形式读取文件 1.示例源码 2.生成效果 四、一种新颖的Windows窗体应用文件设计方法 在C#中,OpenFileDialog控件…...
多线程04 死锁,线程可见性
前言 前面我们讲到了简单的线程安全问题以及简单的解决策略 其根本原因是cpu底层对线程的抢占式调度策略,随机调度 其他还有一些场景的问题如下 1.多个线程同时修改一个变量问题 2.执行的操作指令本身不是原子的 比如自增操作就分为三步,加载,自增,保存 3.内存可见性问题 4.指令…...
java中文转拼音(去除音调)
一、jar包 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency> 二、代码 /*** 中文转换拼音*/ public class PinyinConvert {/**** param str 钱多多* r…...
[Android]常见的数据传递方式
Demo:https://github.com/Gamin-fzym/DataTransferDemo 1.Intent 发送页面 A 到页面 B 的 Intent 时,可以通过 Intent 的 putExtra() 方法将数据附加到 Intent 上。 在页面 B 中,通过 Intent 的 getXXXExtra() 方法获取传递的数据。 1).在A页面发送 …...
<蓝桥杯软件赛>零基础备赛20周--第7周--栈和二叉树
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…...
探究Kafka原理-7.exactly once semantics 和 性能测试
👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理🔥如果感觉博主的文章还不错的话,请ὄ…...
【密码学引论】序列密码
第五章 序列密码 1、序列密码 定义: 加密过程:把明文与密钥序列进行异或运算得到密文解密过程:把密文与密钥序列进行异或运算得到明文以字/字节为单位加解密密钥:采用一个比特流发生器随机产生二进制比特流 2、序列密码和分组密…...
知识变现的未来:解析知识付费系统的核心
随着数字时代的发展,知识付费系统作为一种新兴的学习和知识分享模式,正逐渐引领着知识变现的未来。本文将深入解析知识付费系统的核心技术,揭示其在知识经济时代的重要性和潜力。 1. 知识付费系统的基本架构 知识付费系统的核心在于其灵活…...
【Linux基础】Linux常见指令总结及周边小知识
前言 Linux系统编程的学习我们将要开始了,学习它我们不得不谈谈它的版本发布是怎样的,谈它的版本发布就不得不说说unix。下面是unix发展史是我在百度百科了解的 Unix发展史 UNIX系统是一个分时系统。最早的UNIX系统于1970年问世。此前,只有…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
