前言
golang 1.13golang
golang
golang
go.gopathgo.goroot
Ports
支持 arm64
macOS ARM64
Runtime
defer
deferdefer
timer
golang timertimer
runtime: switch to using new timer code
No big changes in the runtime package benchmarks.
Changes in the time package benchmarks:
name old time/op new time/op delta
AfterFunc-12 1.57ms ± 1% 0.07ms ± 1% -95.42% (p=0.000 n=10+8)
After-12 1.63ms ± 3% 0.11ms ± 1% -93.54% (p=0.000 n=9+10)
Stop-12 78.3µs ± 3% 73.6µs ± 3% -6.01% (p=0.000 n=9+10)
SimultaneousAfterFunc-12 138µs ± 1% 111µs ± 1% -19.57% (p=0.000 n=10+9)
StartStop-12 28.7µs ± 1% 31.5µs ± 5% +9.64% (p=0.000 n=10+7)
Reset-12 6.78µs ± 1% 4.24µs ± 7% -37.45% (p=0.000 n=9+10)
Sleep-12 183µs ± 1% 125µs ± 1% -31.67% (p=0.000 n=10+9)
Ticker-12 5.40ms ± 2% 0.03ms ± 1% -99.43% (p=0.000 n=10+10)
Sub-12 114ns ± 1% 113ns ± 3% ~ (p=0.069 n=9+10)
Now-12 37.2ns ± 1% 36.8ns ± 3% ~ (p=0.287 n=8+8)
NowUnixNano-12 38.1ns ± 2% 37.4ns ± 3% -1.87% (p=0.020 n=10+9)
Format-12 252ns ± 2% 195ns ± 3% -22.61% (p=0.000 n=9+10)
FormatNow-12 234ns ± 1% 177ns ± 2% -24.34% (p=0.000 n=10+10)
MarshalJSON-12 320ns ± 2% 250ns ± 0% -21.94% (p=0.000 n=8+8)
MarshalText-12 320ns ± 2% 245ns ± 2% -23.30% (p=0.000 n=9+10)
Parse-12 206ns ± 2% 208ns ± 4% ~ (p=0.084 n=10+10)
ParseDuration-12 89.1ns ± 1% 86.6ns ± 3% -2.78% (p=0.000 n=10+10)
Hour-12 4.43ns ± 2% 4.46ns ± 1% ~ (p=0.324 n=10+8)
Second-12 4.47ns ± 1% 4.40ns ± 3% ~ (p=0.145 n=9+10)
Year-12 14.6ns ± 1% 14.7ns ± 2% ~ (p=0.112 n=9+9)
Day-12 20.1ns ± 3% 20.2ns ± 1% ~ (p=0.404 n=10+9)
Updates #6239
Updates #27707
Change-Id: I51e25a90f941574f1a9cf83a22e84ac8c678537d
Reviewed-on: https://go-review.googlesource.com/c/go/+/171883
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Goroutine 支持异步抢占
在 Go 1.12 版本以前,调度器只能依靠 goroutine 主动让出 CPU 资源,这样存在非常严重的调度问题:
设想一下,假如一个 goroutine 陷入死循环,它会一直占用系统资源,会导致调度器延时和垃圾回收延时。
垃圾回收需要暂停整个程序(Stop-the-world,STW),如果没有抢占可能需要等待几分钟的时间,导致整个程序无法工作。
在 Go 1.12 版本中,采用一个非协作式的抢占技术, 来允许对很长的循环进行抢占。在特定时机插入函数,通过函数调用作为入口触发抢占,实现了协作式的抢占式调度。这种抢占方式并不是强制发生的,不会使一个没有主动放弃执行权、且不参与任何函数调用的 goroutine 被抢占。
在 Go 1.14 版本中,引入了基于系统信号的异步抢占调度,这样,像上面的无函数调用的死循环 goroutine 也可以被抢占了,不过代价是出现死循环导致的性能下降问题更难排查了。
更高效的页分配器(page allocator)
GOMAXPROCS
提高小对象在高内核数下的分配
在 Go 1.15 版本中,小对象的分配现在在高内核数下表现更好,并且最坏情况下的等待时间也更短。
语言层
允许嵌入具有相同方法的接口
Go 1.14 根据重叠接口建议允许嵌入具有相同方法的接口。
type A interface {
TestA()
String() string
}
type B interface {
TestB()
String() string
}
type C interface {
A
B
}
String redeclared
注:如果两个接口有相同名称的方法,但是签名不一样的话,还是会报错
image
不允许相对路径导入
import.
import (
"./tools/image"
"../models/core"
"some.pkg.com/好用的库/"
)
工具
Module
Go 1.14 可以在 Go 命令中使用 Module 支持,以供生产使用,并且鼓励所有用户迁移到 Go Module 以进行依赖项管理。
Go 1.16 默认情况下,启用 Go Module,而不管当前工作目录或父目录中是否存在 go.mod 文件。更准确地说,GO111MODULE 环境变量现在默认为 on。要切换到以前的行为,请设置 GO111MODULE 为 auto。并且发布了开发和发布模块的官方文档。
Test
go test -vt.Log
testingT、BTBCleanUp
CleanUp(f func())
举一个例子:
func TestSomething(t *testing.T) {
t.CleanUp(func() {
fmt.Println("Cleaning Up!")
})
t.Run(t.Name(), func(t *testing.T) {
})
}
testbenchmarkt.CleanUpb.CleanUp
os.Exit(0)
GOPROXY 支持跳过返回错误的代理
GOPROXYGOPROXY
全新链接器
在 Go 1.15 对链接器的重大改进,可减少链接器资源的使用(时间和内存)并提高代码的健壮性/可维护性。
对于一组典型的大型 Go 程序,对于 ELF 在 amd64 体系结构上运行的基于 OS(Linux,FreeBSD,NetBSD,OpenBSD,Dragonfly 和 Solaris)的操作系统,链接速度提高 20%,平均所需内存减少 30%,对于其他架构/操作系统组合。
改进链接程序性能的关键因素是新设计的目标文件格式,以及内部阶段的改进以提高并发性(例如,将重定位并行应用于符号)。Go 1.15 中的目标文件比其 1.14 等价文件稍大。
这些更改是对 Go 链接器进行现代化改造的多版本项目的一部分,这意味着将来的版本中有望对链接器进行其他改进。
-buildmode=pieon linux/amd64linux/arm64-buildmode=pie-ldflags=-linkmode=externalflag
核心库
新增 tzdata 包
time/tzdataimport _ "time/tzdata"-tags timetzdata
弃用 X.509 CommonName
x509ignoreCN=0GODEBUG
CommonNameGODEBUG
支持资源嵌入
embednew//go:embed
弃用 io/ioutil
io/ioutilio/ioutilioosio/ioutil
- Discard => io.Discard
- NopCloser => io.NopCloser
- ReadAll => io.ReadAll
- ReadDir => os.ReadDir (注意:返回的是 os.DirEntry 切片而不是 fs.FileInfo 切片)
- ReadFile => os.ReadFile
- TempDir => os.MkdirTemp
- TempFile => os.CreateTemp
- WriteFile => os.WriteFile
go build 不再更改 mod 相关文件
go buildmod
从 Go 1.16 开始这一行为被禁止了。想要安装、更新依赖只能使用 go get 命令,go build 和 go test 将不会再做这类工作。
go install
go install 在 Go 1.16 中也有了不小的变化。
go install my.module/tool@1.0.0module
go install
也就是说 go 的命令各司其职,不再长臂管辖了。
tcp 半连接队列扩容
/proc/sys/net/core/somaxconn4096
2^32-14294967295
更大的半连接队列意味着可以同时处理更多的新加入请求,而且不用再读取配置文件性能
也会略微提升。
小结
golang