Go1.21 速览:go.mod 的 Go 版本号将会约束 Go 程序构建,要特别注意了!

news2024/11/24 18:25:52

大家好,我是煎鱼。

之前 Go 核心团队的负责人 Russ Cox 针对 Go 的向前兼容(指的是旧版本的 Go 编译新的 Go 代码),进行了进一步的设计。

20dfdd6592b6fdeed84e1937bd602a5c.png

重点内容如下:

  1. 新增 GOTOOLCHAIN 环境变量的设置。

  2. 改变在工作模块(work module)中解释 go 行的方式,增加了新的工具链(toolchain)行以此实现声明。此对应的是 go.mod 文件的 go 行和 toolchain 行。

  3. 对 go get 等命令进行联动修改,允许对 GOTOOLCHAIN 和工作模块的 go 版本进行修改。

约束旧版本使用

从 Go1.21 开始,Go 语言将会将把 go.mod 文件中的 go 行解释为 Go 应用程序运行所需的最低 Go 版本。

像下面这个 Go 项目:

17ff11e2cd9e0937c7edd9f283767482.png

他在 go.mod 文件中的 go 行就是 Go1.13。只要你本地的 Go 版本大于等于 Go1.13 就可以编译成功。

反过来,失败的场景呢?例如:你的本地是 Go1.21 版本,在编译时遇到一个写着 Go1.22 的 go.mod 文件,那么编译器将拒绝构建该模块的代码。

结论上来讲,Go1.21 后,Go 应用程序就不能无视运行环境的 Go 版本任意的编译和启动了。需要符合 go.mod 文件中的 Go 行的版本要求,至少是等于或大于。

否则就可能会出现编译无法通过的情况。

增强构建约束

大家平时可以在 Go 源码文件顶部附近中看到一些神奇的 “符号”:

//go:build !windows && !plan9

又或是:

// +build !windows,!plan9

这是 Go 在构建时的构建约束。因为在真实环境中,可能需要为不同的编译环境编写不同的 Go 代码,所以需要做构建约束。

其主要支持如下几种:

  • 指定编译的操作系统,例如:windows、linux 等,对应 runtime.GOOS 的值。

  • 指定编译的计算机架构,例如:amd64、386,对应 runtime.GOARCH 的值。

  • 指定使用的编译器,例如:gccgo、gc。

  • 指定 Go 版本,例如:go1.9、go1.10 等。

  • 指定自定义的标签,例如:编译时通过指定 -tags 传入的值。

  • ...

对于本次 go.mod 约束 Go 版本的行为,构建约束也进一步增强了规则,以此适配新的变化。

以前构建约束对于 Go 版本约束只能:

//go:build go1.9

现在可以:

//go:build go1.50 && !go1.60

还可以:

//go:build linux && go1.50 || darwin && go1.60

在 Go 最小版本的计算结果上,官方给出了几个案例,可以结合看看:

GoVersion(linux && go1.22)

结果:Go1.22。

// GoVersion((linux && go1.22) || (windows && go1.20))

结果:Go1.20(Windows)

// GoVersion(linux)

结果:空,也就是无 Go 版本约束

GoVersion((linux && !linux && go1.20) || go1.21)

结果:Go1.20

总结

在这次 Go1.21 的更新中,正式将多年前引入 go.mod 的 Go 行的版本声明使用了起来。想当年 Russ Cox 还是说这只是声明,暂时没有任何的作用。怕不是早已想好下一步了。

接下来 Go 将会有要求符合 go.mod 文件中的 Go 行的版本要求的基本构建要求,满足了才能成功运行起来。需要大家特别注意。

后面我还会继续更新 Go 新版本的最新资讯和特性分享,欢迎持续关注我。

推荐阅读

  • Go1.21 速览:新内置函数 clear、min、max 和新标准库包 cmp!

  • Go1.21 速览:过了一年半,slices、maps 泛型库终于要加入标准库。。。

  • Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇

0d0ddf49028b98f13a0aaf7863665c91.jpeg

6225046db9f174f6a333fff1022205f1.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

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

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

相关文章

阿里云弹性公网EIP收费价格表

阿里云弹性公网EIP怎么收费?EIP地域不同价格不同,EIP计费模式分为包年包月和按量付费,弹性公网IP可以按带宽收费也可以按使用流量收费,阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

cpp新小点1

这里写目录标题 argc argv继承虚继承多态override不加override overload纯虚函数和抽象类虚析构和纯虚析构 static和 constexternself前置 后置默认构造 析构继承构造函数不能是虚函数派⽣类的override虚函数定义必须和⽗类完全⼀致。 有特列何时共享虚函数地址表 智能指针arrm…

【数据库必备知识】上手表设计

目录 📖前言 1. 基本步骤 1.1 梳理清楚需求中的实体 1.2 梳理清楚实体间的关系 2. 实体间的三种关系 2.1 一对一 2.2 一对多 2.3 多对多 🎉小结ending 📖前言 本文讲解的是基本的表设计, 设计一般只有在有一定实际项目经验后, 才能…

MAVEN - 使用maven-dependency-plugin的应用场景是什么?

简述 maven-dependency-plugin是MAVEN的一个插件。 作用 该插件主要用于管理项目中的依赖,使用该插件可以方便地查看、下载、复制和解压缩依赖,还支持生成依赖树和依赖报告。 功能 该插件有很多可用的GOAL,大部分与依赖构建、依赖分析和依…

《面试1v1》Map

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: 小伙子,又来挑战你了。听说你对Java集合中的Map也很在行? 候选人: 谢谢夸奖,Map这个接口的确非常重要且强大…

SpringMVC原理分析 | JSON、Jackson、FastJson

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! JSON JSON(JavaScriptObject Notation,JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer…

无自注意力照样高效!RIFormer开启无需token mixer的Transformer结构新篇章

©PaperWeekly 原创 作者 | 岳廷 研究方向 | 计算机视觉 引言 论文地址: https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_RIFormer_Keep_Your_Vision_Backbone_Effective_but_Removing_Token_Mixer_CVPR_2023_paper.pdf 问题:Vision …

如何将代码中的相关调试信息输出到对应的日志文件中

一、将调试信息输出到屏幕中 1.1 一般写法 我们平常在写代码时&#xff0c;肯定会有一些调试信息的输出&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {char szFileName[] "test.txt";FILE *fp fopen(szFileName, "r")…

R语言 tidyverse系列学习笔记(系列5)dplyr 数据分析之across

成绩单 score install.packages("dplyr") library(dplyr)install.packages("tibble") library(tibble)install.packages("stringr") library(stringr)score tibble(IDc("1222-1","2001-0","3321-1","4898-…

MySQL(八):排序与分页

排序与分页 前言一、排序数据1、排序规则2、单列排序3、多列排序 二、分页1、背景2、实现规则3、拓展 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01;也许一个人独行&#xff0c;可以走的很快&…

从零开始Vue项目中使用MapboxGL开发三维地图教程(三)添加全屏,缩放旋转和比例控制面板以及自定义图标、标记点击弹窗、地图平移等功能

文章目录 1、添加各种控制面板1.1、添加全屏1.2、缩放旋转控制1.3、比例尺 2、获取并显示鼠标移动位置的经纬度坐标3、添加图标3.1、添加图片图层的图标3.2、添加带有标记的自定义图标3.3、悬停时显示弹出窗口 1、添加各种控制面板 1.1、添加全屏 //添加全屏控制this.map.addC…

管理类联考——逻辑——知识篇——第一章 性质命题

第一章 性质命题&#xff08;最基础&#xff0c;最难*****&#xff09; 一、性质命题定义&#xff08;必考&#xff09; 判断事物具有或不具有某种性质的命题。 二、性质命题的四种基本形式 全称肯定&#xff1a;①所有的A都是B 全称否定&#xff1a;②所有的A不是B 特称肯…

Nature子刊:光遗传在绒猴执行检测任务中的行为效应

狨猴体型小&#xff0c;具有巨大的基因修饰潜力&#xff0c;并可表现复杂的行为&#xff0c;已经成为神经科学领域的一个关键模型。 德国恩斯特斯特朗格曼神经科学研究所与马克斯普朗克学会的研究人员设计了一种轻质的、3D打印的植入物&#xff0c;利用高密度硅基微电极阵列&am…

Monorepo vs. Microrepo: 选择适合你的代码仓库策略

简介 在软件开发领域&#xff0c;选择合适的代码仓库策略对于优化协作、可扩展性和代码质量至关重要。Monorepo和Microrepo是两种流行的方法&#xff0c;它们提供了各自的优势和考虑因素。本文将探讨这两种策略的特点&#xff0c;解释为何不同的公司选择不同的选项&#xff0c;…

基于Hexo和Butterfly创建个人技术博客,(5) 使用Hexo的Tags Plugin插件增强博客文章内容和视觉表现力

Hexo官司网查看 这里 注意&#xff1a; Tags语法是Hexo插件提供的&#xff0c;是非标准语言&#xff0c;写文章时要注意以下几点&#xff1a; 用于在文章中快速插入特定的内容&#xff0c;作用等同于其它语言&#xff0c;可理解为一种增强版本的markdown&#xff1b;可混合Mark…

Linux系统编程学习 NO.7 ——sudo配置、编译器的使用

引言&#xff1a; 现在是北京时间2023年6月14日8点16分&#xff0c;期末考试在即&#xff0c;重心可能得转移到考试上了。不过想到马上就可以回家陪家人过端午节&#xff0c;还是非常开心的。放暑假了就可以好好陪家人了。尝试一下换个环境复习吧&#xff0c;洗漱一下就去图书…

智见|比亚迪廉玉波:2023年销量目标300万辆

营收4240亿元&#xff0c;同比增长96%&#xff1b;归属上市公司股东净利润166亿元&#xff0c;同比增长445.86%&#xff1b;累计销售186.85万辆&#xff0c;同比增长152.5%……这是2022年比亚迪的成绩单。 据比亚迪披露&#xff0c;仅2022年一年新能源汽车的销量&#xff0c;就…

【重要】MThings V0.5.0更新要点

再见了BUG&#xff0c;为了改善质量&#xff0c;我们已修正了一些问题&#xff0c;以便您能继续富有成效且令人敬畏。 下载地址&#xff1a; http://gulink.cn/download 01. [新增]支持数据网关功能。 数据网关功能提供协议转换和数据汇聚功能&#xff0c;可实现不同的通道类型…

1--Gradle入门 - 简介、安装、目录结构、创建项目

1--Gradle入门 - 简介、安装、目录结构、创建项目 Gradle 官网 Gradle官网地址&#xff1a;Gradle Build Tool Gradle官方下载安装教程页面&#xff1a;https://gradle.org/install/ Gradle官方用户手册&#xff1a;https://docs.gradle.org/current/userguide/userguide.html …

4--Gradle入门 - 创建普通的web工程

4--Gradle入门 - 创建普通的web工程 前言 上一篇&#xff0c;我们已经创建了java工程&#xff0c;本篇章再来创建web工程。 “ 其实没啥用&#xff0c;还是研究如何部署 Springboot 环境就好了 ” 创建普通的web工程 1. 新建 gradle 管理的工程项目 1685862847224 2. 设置项目使…