Go Team刚刚发布了Go 1.15的正式发布。 受新冠灾祸的影响,这次版本变化的内容不太多,但还是按计划发布了。
大多数更改都在工具链、运行时和库的实现中。 像往常一样,这个版本保留了Go 1兼容性的承诺。 这确保了几乎所有的Go程序都像以前一样成功编译和运行。
Go 1.15包括对链接器的重大改进,改进了对具有大量核心的小对象的分配,取消了x.509公共名称。 GOPROXY目前支持跳过返回错误的代理,并添加了新的内置tzdata包。
看看具体有哪些值得注意的变化。
1、新链接器官方设计文档地址: https://golang.org/s/better-linker,从命名上看,是一个更好的链接器。
此版本的Go减少了链接资源的使用(时间和内存),并提高了代码的稳健性和可维护性。 在amd64体系结构上运行的基于ELF的操作系统(Linux、FreeBSD、NetBSD、OpenBSD、DraGonfly、S olaris ) )中,到典型的大型go部件的链接速度其他体系结构/操作系统组合的改进。 提高链接器性能的主要因素是新设计的目标文件格式和改进的内部阶段以提高并发性。 例如,将重新定位并行应用于符号。 Go 1.15的目标文件比其1.14等效文件稍大。 这些更改是对Go链接器进行现代化改造的多个版本项目的一部分,意味着在将来的版本中可以对链接器进行其他改进。 当前,linux/amd64和linux/arm64中的链接器默认处于-buildmode=pie的内部链接模式,因此这些配置不需要c链接器。
2 .编译器的改进。 调用某些函数时,可以将unsafe.Pointer转换为uintptr,包括小一点的二进制包unsafe安全规则。 以前,编译器可能允许多个链转换。 例如,syscall.Syscall(… (. (,uintptr (, ) )。 编译器现在只需要转换一次。 多次转换的代码必须更新以满足安全规则。
与Go 1.14相比,Go 1.15通过消除特定类型的GC元数据和更主动地消除未使用类型的元数据,将典型的二进制大小减少了约5%。 通过将函数与32字节的边界对齐并输入跳转指令,该工具链现在可以缓解GOARCH=amd64的Intel CPU勘误表SKX102。 此填充增加了二进制大小,但这远远超出了上述二进制大小改进所补充的范围。
Go 1.15允许编译器和汇编器都添加-Spectre标志以启用spectre缓解措施。 这些几乎是绝对不需要的。 主要作为“纵深防御”的机制提供。 有关详细信息,请参见Spectre Wiki页面。
//go: compiler指令现在被编译器拒绝。 这些指令对使用的声明没有意义,会发生“放置错误位置的编译器指令”错误。 这些错误使用的命令以前已被破坏,但编译器却静默地忽略了。
编译器的-JSONoptimizationloggingreport大小=128字节的副本现在包含转义分析决策说明。
3、嵌入了tzdata (时区数据)添加了新软件包。 如果系统找不到时区数据(例如,Windows等),则即使将时区数据嵌入程序中,time/tzdata也可以在编译时通过将该软件包导入-tags timetzdata
此issue:https://github.com/golang/go/issues/38017和软件包time/tzdata说明: https://golang.org/pkg/time/tz data /
4、添加testing.TB.TempDir测试生成临时文件是很常见的,这是为了更好地解决这个问题。 详细信息请访问issue:https://github.com/golang/go/issues/35998。
5、添加testing.T.Deadline,将上下文引入testing包。 详细信息请访问issue:https://github.com/golang/go/issues/28135。
6、端口部分darwin/386、darwin/arm不再支持; riscv64变得更好; linux/arm64目前作为第一类端口受支持。
7、API变动1 ) net/url.URL RawFragment和EscapedFragment,详见issue:https://github.com/golang/go/issues/3776;
2 ) net/url.URL.Redacted,详见issue:https://github.com/golang/go/issues/34855;
3 )我们知道time.Ticker.Reset,Timer有Reset。 这次Ticker也增加了。 详见issue:https://github.com/golang/go/issues/33184;
4 ) r
egexp.Regexp.SubexpIndex,详情见 issue:https://github.com/golang/go/issues/32420;5)sync.Map.LoadAndDelete,详情见 issue:https://github.com/golang/go/issues/33762;
6)crypto/tls.Dialer.DialContext,详情见 issue:https://github.com/golang/go/issues/18482;
还有其他一些 API 变动,不一一列举。
8、工具链1)增加 go env GOMODCACHE:https://github.com/golang/go/issues/34527;
2)opt-in fallbacks in GOPROXY:https://github.com/golang/go/issues/37367;
3)vet:warn about string(int) 和 detect impossible interface assertions:https://github.com/golang/go/issues/32479 和 https://github.com/golang/go/issues/4483;
4)println 允许打印两个值。println(twoValues());
5)panic:显示可打印的值而不是地址。比如:
type MyString stringpanic(MyString("hello"))现在打印:
panic: (main.MyString) (0x48aa00,0x4c0840)期望打印:
panic: main.MyString("hello")可读性会好很多。
9、性能1)在 amd64 上更好的写屏蔽;
2)在 Linux 上,forkAndExec 使用 dup3;
3)sha512 算法速度提升 15%;
4)ReadMemStats 延迟降低 95%;
5)关闭状态的 channel 接收速度提升 99%;
6)将小的 int 值转为 interface{} 不额外分配内存;
10、更详细的改动更多详细的改动,见官方发布文档
Go 1.15 Release Notesdocs.studygolang.com。