前言

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

参考链接