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