Go 1.11

栏目: Go · 发布时间: 6年前

内容简介:新学期开始,虽然不关自己什么事情,但终于能抽出时间来写博客了。新的Go版本在8月24号就发布了,Release Note:按照老规矩,1.10继续维护到1.12发布为止,还有半年的时间供开发者们适配新版本,下面记下自己感兴趣的部分。

新学期开始,虽然不关自己什么事情,但终于能抽出时间来写博客了。

新的 Go 版本在8月24号就发布了,Release Note: https://golang.org/doc/go1.11

按照老规矩,1.10继续维护到1.12发布为止,还有半年的时间供开发者们适配新版本,下面记下自己感兴趣的部分。

操作系统与架构

Linux维持原样,其他操作系统的要求有增删,Windows最低要求Win7,OpenBSD最低6.2,macOS 最低10.10。

WebAssembly

在刚发布升级时就尝鲜安装了一下,然后本地项目直接无法运行。原因是1.11在GOOS中新增js,GOARCH中新增wasm,于是用户项目中所有 *_js.go*_wasm.go 的文件都会被Go tools忽略,需要重命名来解决问题。

RISC-V

GOARCH新增保留字段riscv及riscv64,同上面一样,所有 *_riscv.go 的文件也会被忽略

工具

模块,包版本及依赖管理

1.11新增了模块的概念,目前处于实验性支持的状态,通过使用模块,开发人员不再局限于在GOPATH中工作,版本依赖性信息将是显式而轻量级的,构建过程会更可靠和容易复现。

总之目前还没有达到生产水平,也是等待开发者们使用,收集反馈再改进的状态。

import path限制

由于Go的模块支持在命令行中使用@符号赋予特殊含义,所以禁止在go get命令中出现带@符号的import path。

包加载

golang.org/x/tools/go/package 包提供了一个用于定位和加载Go源码包的API,目前未合并进标准库,但在许多任务中,会比原先的go/build包更好地支持模块,不需要依赖外部的查询命令来获取包的信息,有利于编写与其他构建系统类似的分析工具。

Build cache支持

1.11仍旧支持手动关闭build cache,但作为消除 $GOPATH/pkg 的一环,它将在1.12中会强制启用。build cache特性会缓存构建结果并复用,上述的模块以及包加载功能需要在它开启的状态下使用。

编译器 工具

(1)更多的函数默认内联,包括panic。

(2)支持行指令中的列信息。

(3)引入了新的包导出数据格式,对于用户透明。

(4)若switch语句中存在未使用的变量,编译器会报错,在 gccgogo/types 中已经启用。

汇编

amd64架构支持avx512指令集

调试

编译器为优化后的二进制文件生成更多有效的调试信息,包括变量位置、行数、断点位置,这让我们有可能对使用“ -N -l ”编译指令生成的二进制文件进行调试。调试信息的质量还有一些限制,在后续的版本发布中会有改善。

由于编译器生成了更精确的调试信息,DWARF段被压缩掉,这对于使用ELF工具的的BSD及 Linux 来说是透明的,Delve调试器已经在所有平台上支持了这个特性,但在macOS与windows上,原生工具只有受限的功能支持,可以在构建时传入 -ldflags=-compressdwarf=false 来关闭该特性。

1.11新增了在调试器中调用Go函数的功能,目前还是实验性支持,例如在一个断点里调用 Strings 的方法,目前这个功能只能在Delve 1.1.0及以上版本中使用,有点像chisel。

测试

从Go 1.10开始,go test命令会在测试的包中调用go vet命令,在开始测试前检查代码问题。由于vet指令会在运行前使用 go/types 对代码进行类型检查,未进行类型检查的测试代码会失败。特别是对于一个闭包内部含有未使用变量的测试代码,现在会报“ unused variable ”错误。

-memprofile标志的值现在默认为“ allocs ”,它将会记录测试开始后(包括垃圾回收)分配的字节数。

语法检查

之前的类型检查错误只会引起一个警告,并在go vet执行结束时返回状态1,而现在,如果包没有进行类型检查,执行go vet指令会报fatal error。

另外,go vet在对 printf 的封装进行格式检查时会更健壮,例如将参数传入与格式不匹配的封装函数也会被检查到。

性能调优

得益于新的runtime/trace包的用户标记API,现在我们可以在执行跟踪中记录应用程序级信息,并创建相关goroutine组,go tool trace命令可在跟踪视图和新用户任务或区域分析页面中显示这些信息。

Cgo

从Go 1.10开始,cgo已经将一些C指针类型转译成Go的uintptr类型,包括Darwin平台CoreFoundation中的CFTypeRef,以及 Java 的JNI接口中的jobject,Go 1.11对这些检测特殊指针类型的代码做了许多改进。

Godoc

Go 1.11将会是最后一个支持 godoc 命令行指令的版本,后续的版本中 godoc 将只作为一个网页服务器,用户需要使用 go doc (中间带空格)命令替代。

godoc网页服务器现在会显示哪一个Go版本引入了新API特性。

运行时

运行时现在使用稀疏堆布局方式,因此不再限制Go堆的大小(之前的限制是512GB),这也解决了使用 -race 编译或Go与C混编的二进制文件中罕见的“ 地址空间冲突 ”问题。

在macOS及iOS上,runtime现在使用libSystem.so库代替直接调用内核的方式,这会使Go二进制文件与未来版本的macOS及iOS更兼容。syscall包仍然执行直接系统调用,在未来的版本中会计划修复这个问题。

性能

还是老样子,虽然改了很多,但不晓得有木有改善,大多数的程序应该会运行的快一点,因为核心库的代码有了更好的代码生成与优化。

math/big包中有许多的性能改善,arm64架构相关的包也一样。

编译器工具链

(1)优化了在使用range遍历map时,删除map元素的代码。

(2)优化了以 append(s, make([]T, n)…) 格式拓展切片的代码。

(3)更积极的边界检查和分支消除策略,现在可以检测到传递关系,例如可以利用 i<j 以及 j<len(s) ,消除对 s[i] 的边界检查分支。编译器还可以理解简单的算法,例如 s[i-10] ,并且可以在循环中识别更多的归纳情况。此外,编译器现在使用边界信息来更积极地优化移位操作。

核心库

许许多多的微小修改


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

规划算法

规划算法

拉瓦利 / 2011-1 / 99.00元

《规划算法》内容简介:规划是人类智慧的结晶,规划问题广泛地存在于人们的日常工作和生活中。现在,规划已涉及计算机科学、人工智能、力学、机械学、控制论、对策论、概率论、图论、拓扑学、微分几何、代数几何等许多现代科学领域。《规划算法》是作者多年来教学和科研工作的总结,系统地介绍了规划领域中的基础知识和最新成果。作者将三个相对独立的学科:机器人学、人工智能和控制论巧妙地结合在一起。《规划算法》给出了大量内......一起来看看 《规划算法》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试