golang 1.19 工具、運行時、庫、性能,改良版

前言

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.Int64atomic.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=amd64GOARCH=arm64

Go 編譯器現在需要 -p=importpath 標誌來構建可鏈接的目標文件。這已經由 go 命令和 Bazel 提供。任何其他直接調用 Go 編譯器的構建系統都需要確保它們也傳遞了這個標誌。

Go 編譯器不再接受 -importmap 標誌。直接調用 Go 編譯器的構建系統必須使用該 -importcfg 標誌。

小結

Go 1.19 是對 Go 1.18 的改進版,在工具鏈運行時都有提升,值得升級。有關 1.19 中所有內容的更詳細說明,請參閱發行說明

參考鏈接

延伸閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章