Go 1.15新特性学习笔记
2020-08-16
Go 1.15继1.14 6个月后发布,主要是在工具链、运行时和类库上的改进,改版本继续保持对Go 1.x版本的兼容性。
Go 1.15值得关注的变化 #
Go 1.15中一些值得关注的地方:
- 对Go链接器的实质性改进
- 改进了对高核心计数的小对象的分配
- X.509 CommonName弃用
- GOPROXY支持跳过返回错误的代理
- 新增了一个
time/tzdata
包 - 核心库的一些改进
从这些变化上可以看出,这个版本变化不太大,其实在工具链和运行时上也不需要过多关注,直观的体验是编译的二进制文件大小确实比1.14小了一点点。
核心库的一些改进 #
Go 1.15在语言方面没有什么改动,只是对核心库进行了一些改进。下面把https://golang.org/doc/go1.15#minor_library_changes内容描述中可能经常用到的快速过一遍:
time.Ticker增加了一个Reset方法支持改变ticker的duration。 time.Ticker是一个周期性的定时器,内置一个周期性传递时间的Channel。 使用
time.NewTicker(d Duration)
函数创建一个Ticker,这个Ticker内置一个通道字段,每个时间间隔会向这个通道发送当前的时间。ticker会调整时间间隔或者丢弃消息以适应反应慢的接收者。1func TestTickerReset(t *testing.T) { 2 wait := make(chan struct{}) 3 ticker := time.NewTicker(time.Second * 1) 4 go func() { 5 defer close(wait) 6 for i := 0; i < 5; i++ { 7 t.Log(<-ticker.C) 8 if i == 2 { 9 ticker.Reset(time.Second * 2) 10 } 11 } 12 }() 13 <-wait 14}
time/tzdata
是Go 1.15新增加的包,当系统找不到时区数据时,通过导入这个包,可以在程序中内嵌时区数据。 导入这个包会使程序大小增加大约800KB,注意time/tzdata
这个包应该是在程序的main包中导入的,而不要在一个libary项目中导入和使用。 另外也可以通过编译时传递-tags timetzdata
来实现同样的效果。