ARM|Golang 1.17,新功能介绍

ARM|Golang 1.17,新功能介绍

今日Golang官方网站宣布发布最新1.17 。 本地版本发布距离上一个稳定版本1.16过去了六个月了 , 新版本坚持Golang 1的版本兼容承诺不会影响绝对多数的Golang应用 。 该发布主要在工具链、运行时和库更新 。详细的功能介绍请随虫虫一起学习 。
语言变化Golang1.17 在语言方面带了三个小的改进 。
从切片转化到数组指针:在新版本中 , 一个[
T类型表达式s的可以转换为数组指针类型 *[N
T 。 对于转换结果数组a , 其索引范围需要满足条件:
&a[i
== &s[i
, 0 <= i < N
如果 len(s)小于N则程序会panic
unsafe.Add:unsafe.Add(ptr len)添加len到ptr并返回更新后的指针 unsafe.Pointer(uintptr(ptr) + uintptr(len)).
unsafe.Slice:对T*类型ptr表达式unsafe.Slice(ptr len)函数返回一个[
T类型的切片 。 其数组下表以ptr开始 , 程度为len 。
添加了包不安全增强功能以简化编写符合到unsafe.Pointer的安全规则, 但规则保持不变 。 特别是现有的正确使用的程序unsafe.Pointer还有效 , 并且新程序必须遵守规则使用unsafe.Add或unsafe.Slice.
注意 , 从切片到数组指针的新转换是第一种类型转换 , 可能在运行时发生panic情形 。
PortsDarwin
Golang支持macOS , 需要的版本为10.13 Sierra 或更高版本;
Windows
Windows 平台Go 1.17 增加了ARM 64位架构的支持(windows/arm64 ports) , 支持cgo 。
OpenBSD
OpenBSD 上的64位MIPS架构(openbsd/mips64)新版本中支持cgo 。
在Go 1.16中 , 在64位x86和64位ARM架构上OpenBSD( penbsd/amd64和 openbsd/arm64)系统调用是通过libc 。 Go 1.17中 , 在OpenBSD 上的32位x86和32位ARM架构上也是同样调用(openbsd/386和 openbsd/arm端) 。 这确保了与OpenBSD 6.9以后的兼容性 , 后者需要要通过的系统调用libc对于非静态 golang二进制 。
ARM64
Golang程序新版中在64位ARM上维护堆栈帧指针 , 对所有操作系统上都是同样的架构 。 之前的堆栈帧指针仅适用于Linux、macOS和iOS 。
loong64 GOARCH 值保留
主要的Golang编译器还不支持 LoongArch 架构 , 保留GOARCH值“loong64” 。Go文件名为*_loong64.go现在会会被 Go工具忽略 , 除非正在使用该GOARCH值 。
工具链Go命令模块图精炼
如果模块指定go 1.17或者之后的版本 。 模块图仅包括直接依赖的go 1.17模块 , 而非其完整传递依赖关系 。
为了保持go命令可以正确解析精简的模块依赖关系图 , 每个模块的go.mod文件需要包括有关与该模块相关的传递依赖项的更多详细信息 。 如果一个模块go.mod文件go版本为1.17 , 其go.mod文件需要用require指令明确指定每个提供可传递导入包的模块 。
go.mod模块图精简所需的文件包括加载任何包的导入所需的所有依赖项主模块 , 如果主模块指定为go 1.17或之后版本 , go工具不再读取或下载 , 其请求中不必要的主go.mod中的模块 。
由于显式的扩展一个扩大了Go 1.17的go.mod文件的 , go 1.17中新增的间接的依赖需要单独在require块维护 。
为了方便升级到 Go 1.17精简模块图 , gomodtidy子命令现在支持 -go选项用来转换现有模块的go.mod文件的go版本到Go 1.17 。 可以运行:
go mod tidy -go=1.17
默认情况下 , go mod tidy验证与主模块相关的所选依赖项版本相同之前的Go版本使用的版本 , 并保留go.sum版本所需的条目 。
-compat标志允许覆盖该版本以支持较旧的版本 , 直到指定的版本go指令中的 go.mod文件 。
go mod tidy -compat=1.17
请注意 , 即使主模块使用-compat=1.17进行转换 go 1.16或更早的模块的用户require模块来仍然可以使用 , 前提是包只使用兼容的语言和库特征 。

相关经验推荐