前言
8 月 2 日,Go 團(tuán)隊(duì)發(fā)布了 Go 1.19,該版本主要是對(duì) Go 1.18 的改進(jìn)。Go 1.19 大部分更改都在工具鏈、運(yùn)行時(shí)和庫(kù)的實(shí)現(xiàn)中。與往常一樣,該版本保持了 Go 1 的兼容性承諾,幾乎所有 Go 程序都能像以前一樣繼續(xù)編譯和運(yùn)行。
語言
對(duì)方法聲明中類型參數(shù)的范圍進(jìn)行了修正,詳見 https://tip.golang.org/ref/spec#Declarations_and_scope。
Go 1.19 解決了一些泛型的問題,并且提升了泛型性能(某些泛型程序高達(dá) 20%)。
內(nèi)存模型
Go 內(nèi)存模型現(xiàn)在明確定義了 sync/atomic 包的行為。happens-before 關(guān)系的正式定義已被修改,以與 C、C++、Java、JavaScript、Rust 和 Swift 使用的內(nèi)存模型保持一致?,F(xiàn)有程序不受影響。隨著內(nèi)存模型的更新, sync/atomic 包中還有新的類型,例如 atomic.Int64 和 atomic.Pointer[T],以便更容易使用原子值。
工具
文檔
文檔注釋現(xiàn)在支持鏈接、列表和更清晰的標(biāo)題語法。此更改有助于用戶編寫更清晰、更容易瀏覽的文檔注釋,尤其是在具有大型 API 的包中。作為此更改的一部分,gofmt 現(xiàn)在重新格式化文檔注釋以將標(biāo)準(zhǔn)格式應(yīng)用于這些功能的使用。有關(guān)所有詳細(xì)信息,可參閱 Go Doc Comments。
新的 unix 構(gòu)建約束
unix 現(xiàn)在可以按 //go:build 行識(shí)別構(gòu)建約束。如果目標(biāo)操作系統(tǒng)(也稱為 GOOS)是 Unix 或類 Unix 系統(tǒng),則滿足約束。對(duì)于 1.19 版本,如果 GOOS 是 aix, android, darwin, dragonfly, freebsd, hurd, illumos, ios, linux, netbsd, openbsd, 或中的一個(gè)則滿足 solaris。在未來的版本中,該 unix 約束可能與其他新支持的操作系統(tǒng)相匹配。
庫(kù)
出于安全原因, os/exec 包不再遵循 PATH 查找中的相對(duì)路徑。有關(guān)詳細(xì)信息,可參閱 package 文檔。golang.org/x/sys/execabs 的現(xiàn)有用途可以在僅使用 Go 1.19 或更高版本構(gòu)建的程序中移回 os/exec。
運(yùn)行時(shí)
垃圾收集器增加了對(duì)軟內(nèi)存限制的支持,在新的垃圾收集指南中有詳細(xì)討論。該限制對(duì)于優(yōu)化 Go 程序以在具有專用內(nèi)存量的容器中盡可能高效地運(yùn)行特別有用。
動(dòng)態(tài)調(diào)整初始 goroutine 堆棧以減少堆棧復(fù)制。
在大多數(shù) Unix 系統(tǒng)上自動(dòng)使用附加文件描述符。
在 ARM64 上添加了對(duì)調(diào)試器注入函數(shù)調(diào)用的支持,使用戶能夠在使用經(jīng)過更新以利用此功能的調(diào)試器時(shí),在交互式調(diào)試會(huì)話中從其二進(jìn)制文件調(diào)用函數(shù)。
Ports
Go 1.19 增加了對(duì)龍芯 64 位架構(gòu) LoongArch ( GOARCH=loong64) 和 RISC-V 上的 register ABI 支持 的支持。
編譯器
編譯器現(xiàn)在使用跳轉(zhuǎn)表來實(shí)現(xiàn)大整數(shù)和字符串 switch 語句。switch 語句的性能改進(jìn)各不相同,但可以快 20% 左右。(只支持 GOARCH=amd64 和 GOARCH=arm64)
Go 編譯器現(xiàn)在需要 -p=importpath 標(biāo)志來構(gòu)建可鏈接的目標(biāo)文件。這已經(jīng)由 go 命令和 Bazel 提供。任何其他直接調(diào)用 Go 編譯器的構(gòu)建系統(tǒng)都需要確保它們也傳遞了這個(gè)標(biāo)志。
Go 編譯器不再接受 -importmap 標(biāo)志。直接調(diào)用 Go 編譯器的構(gòu)建系統(tǒng)必須使用該 -importcfg 標(biāo)志。
小結(jié)
Go 1.19 是對(duì) Go 1.18 的改進(jìn)版,在工具鏈、運(yùn)行時(shí)和庫(kù)都有提升,值得升級(jí)。有關(guān) 1.19 中所有內(nèi)容的更詳細(xì)說明,請(qǐng)參閱發(fā)行說明。