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
complete
module graph- 在 Go 1.17 之前,某个 Module 的依赖图由该 Module 的
直接依赖
以及所有间接依赖
组成 - 无论某个间接依赖是否真正为原 Module 的构建做出贡献,Go 命令在解决依赖时都会读取
每个依赖
的go.mod
- 在 Go 1.17 之前,某个 Module 的依赖图由该 Module 的
pruned
module graph- 从 Go 1.17 开始,在
complete
module graph 的基础上,裁剪
那些对构建完全没有贡献
的间接依赖
- 使用
pruned
module 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
install
golang.org/x/exp/cmd/txtar@latest
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.