兼容性

Golang 1.16 相对于 Golang 1.15 版本来说语言上没有任何变化,主要都是 工具链、运行时、库实现上面。因此与之前版本保持兼容。

更新特性

多平台支持

netbsd/arm64openbsd/mips64GO386=387linux/rscv64cgo-buildmod=pie

工具

Go Modules

GO111MODULEautoongo buildgo testgo.modgo.sumgo mod tidygo getgo installgo install exam ple.com/cmd@v1.0.0go installgo get-d-d-dgo installgo get-dgo.modretractretract 0.3.1retractgo mod tidygo mod vendor-ego.modexclude
go getcd $(mktemp -d); GO111MODULE=on go get example.com/cmd@v1.0.0go install

嵌入文件

jar
go//go:embed

简单使用示例如下:

package main

import (
	_ "embed"
	"fmt"
)

//go:embed version.txt
var version string

func main() {
	fmt.Printf("version %q\n", version)
}

Go test

go testos.Exit(0)TestMainos.Exit(0)
func TestMain(m *testing.M)
-c-i

Go get

go get-insecureGOPRIVATEGONOSUMDB

GOVCS 环境变量

go help vcs

all 模式 ???

go mod vendorvendortest

-toolexec 构建标识

-toolexecgo buildgo asmTOOLEXEC_IMPORTPATH

-i 构建标识

go buildgo installgo test-i

list 命令

-exportBuildID

-overlay 标识

-overlay标志指定了一个包含一组文件路径替换的JSON配置文件。覆盖标志可以用于所有构建命令和go mod子命令。它主要用于编辑器工具,如gopls,以了解对源文件未保存的更改的影响。配置文件将实际文件路径映射到替换文件路径,go命令及其构建将在实际文件路径与替换文件路径给出的内容存在的情况下运行,如果替换文件路径为空,则不存在。

Cgo

cgoc structgo structsizecgo

Vet

新增一个在 goroutine 中使用 test.T 的警告

func TestFoo(t *testing.T) {
    go func() {
        if condition() {
            t.Fatal("oops") // This exits the inner func instead of TestFoo.
        }
        ...
    }()
}

新增一个帧指针的警告

CL 248260

新增一个 asn1.Unmarshal 的警告

json.Unmarshalxml.Unmarshal

运行时

runtime.ReadMemStatsdebug.GCStats
GODEBUGinittrace=1

在Linux上,运行时现在默认为及时向操作系统释放内存(使用MADV_DONTNEED),而不是在操作系统面临内存压力时懒释放(使用MADV_FREE)。这意味着像RSS这样的进程级内存统计将更准确地反映Go进程所使用的物理内存的数量。目前使用 GODEBUG=madvdontneed=1 来改善内存监控行为的系统不再需要设置这个环境变量。

RaceRace

编译器

编译器现在可以内联带有非标记的for循环、方法值和类型开关的函数。内联器还可以检测到更多可以内联的间接调用。

链接器

这个版本包括对Go链接器的额外改进,减少了链接器的资源使用(包括时间和内存),并提高了代码的健壮性/可维护性。这些变化构成了使 Go 链接器现代化的两个版本项目的后半部分。

1.16中的链接器变化将1.15的改进扩展到所有支持的架构/操作系统组合(1.15的性能改进主要集中在基于ELF的操作系统和amd64架构)。对于一组有代表性的大型围棋程序,链接速度比1.15快20-25%,对于linux/amd64来说,需要的内存平均少5-15%,其他架构和操作系统的改进更大。由于更积极的符号修剪,大多数二进制文件也更小。

在Windows上,go build -buildmode=c-shared现在默认会生成Windows ASLR DLLs。ASLR可以用--ldflags=-aslr=false来禁用。

核心库

嵌入文件

//go:embed

文件系统

新的io/fs包定义了fs.FS接口,这是一个对文件的只读树的抽象。标准库包已经被调整为适当地使用该接口。

在接口的生产者方面,新的embed.FS类型实现了fs.FS,zip.Reader也是如此。新的os.DirFS函数提供了一个由操作系统文件树支持的fs.FS的实现。

在消费者方面,新的 http.FS 函数将 fs.FS 转换为 http.FileSystem。此外,html/template和text/template包的ParseFS函数和方法从fs.FS中读取模板。

对于测试实现fs.FS的代码,新的测试/fstest包提供了一个TestFS函数,用于检查和报告常见的错误。它还提供了一个简单的内存文件系统实现,MapFS,这对测试接受fs.FS实现的代码很有用。

io/ioutil 包已废弃

之前的 io/ioutil 包被标记废弃,但是还可以使用,不过鼓励迁移

  • Discard => io.Discard
  • NopCloser => io.NopCloser
  • ReadAll => io.ReadAll
  • ReadDir => os.ReadDir (note: returns a slice of os.DirEntry rather than a slice of fs.FileInfo)
  • ReadFile => os.ReadFile
  • TempDir => os.MkdirTemp
  • TempFile => os.CreateTemp
  • WriteFile => os.WriteFile

其他库的小变化