Go - 1.17
语法特性
切片 -> 数组指针
数组切片化,转换后,数组将成为切片的底层数组
1 | a := [3]int{11, 12, 13} |
在 Go
1.17之前,不支持将切片转换为数组类型,仅可以通过unsafe包以不安全的方式实现转换unsafe包的安全性没有得到编译器和运行时的保证,尽量不要使用
1 | sl := []int{11, 12, 13} |
从 Go 1.17 开始,支持从
切片转换为数组类型指针
1 | sl := []int{11, 12, 13} |
Go 会通过
运行时而非编译器去对转换代码进行检查,如果发现越界行为,触发运行时panic
检查原则:转换后的数组长度不能大于原切片的长度(len)- 为了防止数组越界
1 | sl := []int{11, 12, 13} |
1 | sl := []int{11, 12, 13} |
nil 切片或者 cap 为 0 的空切片,都可以被转换为*[0]int
1 | var s1 []int // nil slice |
Go Module
completemodule graph- 在 Go 1.17 之前,某个 Module 的依赖图由该 Module 的
直接依赖以及所有间接依赖组成 - 无论某个间接依赖是否真正为原 Module 的构建做出贡献,Go 命令在解决依赖时都会读取
每个依赖的go.mod
- 在 Go 1.17 之前,某个 Module 的依赖图由该 Module 的
prunedmodule graph- 从 Go 1.17 开始,在
completemodule graph 的基础上,裁剪那些对构建完全没有贡献的间接依赖 - 使用
prunedmodule graph 进行构建,Go 命令不会去获取不相关的依赖关系,节省时间
- 从 Go 1.17 开始,在
Go 1.17 之前建立的 Go Module
在 go.mod 经过go mod tidy后,require仅保留的都是 main module 的直接依赖(没有间接依赖)
1 | module example.com/lazy |
1 | $ go mod graph |
移除
example.com/c v0.1.0 => ./c1,构建失败
1 | $ go build |
修改 go.mod,将
go 1.15修改为go 1.17,执行go mod tidy重新构建go.mod,新增记录了间接依赖
1 | module example.com/lazy |
移除
example.com/c v0.1.0 => ./c1,构建成功
- module c 并没有为 main module 的构建提供
代码级贡献,Go 命令将其从 main module 的依赖图中裁剪了 - 副作用:
go.mod的size 变大- 从 Go
1.17开始,每次调用go mod tidy,都会对 main module 的依赖做一次深度扫描 - 并将 main module 的
所有直接和间接依赖都记录在go.mod,并存放在不同的require块中
- 从 Go
go
installgolang.org/x/exp/cmd/txtar@latest
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.












