主页

索引

模块索引

搜索页面

1.6.3. go1.17 (released 2021-08-16)

新的语法特性

支持将切片转换为数组指针:

b := []int{11, 12, 13}
p := (*[3]int)(b) // 将切片转换为数组类型指针
p[1] = p[1] + 10
fmt.Printf("%v\n", b) // [11 22 13]

Go Module 构建模式的变化

  • go modules 支持 “修剪模块图”(Pruned module graphs)

  • 如果模块指定 go 1.17 或更高版本,则模块图仅包含其他 go 1.17 模块的直接依赖关系,而不包括它们完整传递依赖关系。但是会在 go.mod 记录间接依赖的库版本。执行以下命令升级: go mod tidy -go=1.17

  • 在 Go 1.17 之前的版本中,某个 module 的依赖图是由这个 module 的直接依赖以及所有间接依赖组成的。这样,无论某个间接依赖是否真正为原 module 的构建做出贡献,Go 命令在解决依赖时都会读取每个依赖的 go.mod,包括那些没有被真正使用到的 module,这样形成的 module 依赖图被称为完整 module 依赖图(complete module graph)。

  • 从 Go 1.17 的版本开始,Go 不再使用 “完整 module 依赖图”,而是引入了 pruned module graph,也就是修剪的 module 依赖图。修剪的 module 依赖图就是在完整 module 依赖图的基础上,将那些对构建完全没有 “贡献” 的间接依赖 module 修剪掉后,剩余的依赖图。使用修剪后的 module 依赖图进行构建,有助于避免下载或阅读那些不必要的 go.mod 文件,这样 Go 命令可以不去获取那些不相关的依赖关系,从而在日常开发中节省时间。

https://img.zhaoweiguo.com/uPic/2023/06/kFtYnz.jpg

module 依赖图修剪的原理

  • go get 已经不再被用来安装某个命令的可执行文件了, 改为go install命令并用 @vx.y.z 明确要安装的命令的二进制文件的版本,或者是使用 @latest 来安装最新版本

Go 编译器的变化

主要变化:

1.  AMD64 架构下实现了基于寄存器的调用惯例
2. 新引入了 //go:build 形式的构建约束指示符
  • 所谓 “调用惯例(calling convention)”,是指调用方和被调用方对于函数调用的一个明确的约定,包括函数参数与返回值的传递方式、传递顺序。只有双方都遵守同样的约定,函数才能被正确地调用和执行。如果不遵守这个约定,函数将无法正确执行。

  • Go 1.17 版本之前,Go 采用基于栈的调用约定,也就是说函数的参数与返回值都通过栈来传递,这种方式的优点是实现简单,不用担心底层 CPU 架构寄存器的差异,适合跨平台,但缺点就是牺牲了一些性能。

  • Go 核心团队决定在 1.17 版本向这些语言看齐,并在 AMD64 架构下率先实现基于寄存器的调用惯例。切换到基于寄存器的调用惯例后,一组有代表性的 Go 包和程序的基准测试显示,Go 程序的运行性能提高了约 5%,二进制文件大小典型减少约 2%。

//go:build 形式的构建约束指示符

https://img.zhaoweiguo.com/uPic/2023/06/EvvseD.jpg

在 Go 1.17 之前,我们可以通过在源码文件头部放置 // +build 构建约束指示符来实现构建约束,但这种形式十分易错,并且它并不支持 && 和 || 这样的直观的逻辑操作符,而是用逗号、空格替代

示例:

//go:build linux && (386 || amd64 || arm || arm64 || mips64 || mips64le || ppc64 || ppc64le)
//go:build linux && (mips64 || mips64le)
//go:build linux && (ppc64 || ppc64le)
//go:build linux && !386 && !arm

其他

unsafe 包新增了 unsafe.Add 和 unsafe.Slice 一些包的改变 如 net 包:

URL 参数解析对 ; 支持的变化,原先 example?a=1;b=2&c=3 会解析成 map[a:[1] b:[2] c:[3]], 现在解析成 map[c:[3]]

增加 IP.IsPrivate 判断私有 IP a.b.c.d 格式的 ip v4 地址不允许每段有前缀 0(因为某些系统会认为前缀 0 表示 8 进制)

参考

主页

索引

模块索引

搜索页面