更多幹貨:關注公衆號奇伢雲存儲linux
[toc]ios
Go 1.16 距離上個 Go 1.15 版本差很少 6 個月,因此這個版本迭代速度仍是挺快的。本次更新沒有對語言自己作變動,主要更新的是工具鏈,運行時( runtime ),標準庫的一些功能實現和性能。Go 1.16 版本保持 Go 1 版本兼容性 的承諾。golang
相關地址:安全
更新命令:markdown
$ go get golang.org/dl/go1.16
$ go1.16 download
複製代碼
多平臺指令的支持
Darwin and iOS
- Go 1.16 支持 64 位 ARM 架構上的 macOS 操做系統 (Apple Silicon),使用方式經過
GOOS=darwin,GOARCH=arm64
;
- 也就是 Apple 發佈的最新的 M1 芯片指令集;
- 至於以前 iOS 平臺上的,則由
darwin/arm64
更名爲 ios/arm64
;
- Go 1.16 添加
ios/amd64
的類型;
- Go 1.16 運行至少須要的系統版本 >= macOS 10.12 Sierra;
NetBSD
Go 1.16 在 NetBSD(netbsd/arm64
)上支持 64 位 ARM 體系架構。架構
OpenBSD
Go 1.16 在 OpenBSD(openbsd/mips64
)上支持 MIPS64 體系架構,不支持 cgo。函數
386
Go 1.16 放棄了對 x87 模式編譯(GO386=387
)的支持。如今使用軟浮動模式(GO386=softfloat
)支持非 SSE2 處理器。在非 SSE2 處理器上運行的用戶應替換GO386=387 爲GO386=softfloat
。工具
RISC-V
Go 1.16 在 linux/riscv64
如今支持 cgo 和 -buildmode=pie 。Go 1.16 對 RISC-V 指令集作了部分的優化。oop
工具鏈
Go Command
- module-aware 模式成爲默認狀態。
- 支持使用
//go:embed
指令來將靜態文件和文件樹做爲可執行文件的一部分直接內嵌包含在裏面。
Cgo
- cgo tool 再也不翻譯 C 語言裏的位域字段( C struct bitfields )對應到 Go 的結構體字段了(這一點要很是注意了,在使用 Cgo 的時候,這裏沒注意到的話,就會致使嚴重的 bug)。
Vet
- 新增對無效測試場景的告警,好比單測某些場景對 Fatal 的無效調用;
- 新增對 frame pointer 的告警,這個主要是針對一些彙編代碼,破壞了對 bp 寄存器的使用約定,Go 1.16 將會對這種檢測出來並告警;
- 新增
asn1.Unmarshal
的警告,好比傳遞非指針對象或者 nil 值;
運行時
- 新增 runtime/metrics 包的功能,替代runtime.ReadMemStats 和 debug.ReadGCStats,runtime/metrics 包更通用、穩定、高效;
GODEBUG
環境變量支持跟蹤:GODEBUG
環境變量包含inittrace=1
時,Go 運行時將會 trace 輸出 package 的 init 函數的執行時間和一些內存分配消耗狀況;
編譯器
- 對內聯的複雜場景的識別和優化,好比 Go 1.16 能夠內聯具備未標記 for 循環,方法值和類型判斷的函數。
連接器
- 進一步優化連接階段的性能,減小了連接程序資源的使用(時間和內存),並提升了代碼的健壯性/可維護性。Go 1.16 連接平均比Go 1.15 的快20%-25%,消耗的內存減小 5%-15%(
linux/amd64
平臺數據)。
標準庫
- 新
io/fs
package 定義了fs.FS
接口,它是文件只讀樹的抽象;
- 棄用
io/ioutil
,存量功能遷出到其餘具體的 package。好比 Discard => io.Discard
,TempDir => os.MkdirTemp
等等。其實主要是遷入到 io 和 os 這兩個 package;
- 對 Unicode 標準的支持從 12.0.0 升級爲 13.0.0;
- net 標準庫的實現中,在 Linux 上,在缺失 /etc/hosts 時,主機名查找再也不使用 DNS /etc/nsswitch.conf。這個作法常見於基於 Musl 的系統,並使得 Go 程序與這些系統上 C 程序的行爲相一致;
總結
- Go 1.16 主要是 bugfix 和穩定性的提高,並無重大的特性變化;
- Go 1.16 對多平臺多指令架構作了更好的兼容,特別是對 2020 年 Apple 發佈的 M1 芯片;
- Cgo tool 再也不對 C 的位域作轉換,這裏要注意;
- Vet 新增了一些告警檢測,讓咱們的語法檢查更全面和安全;
- 連接階段進一步提升了性能,連接速度更快而且耗費資源更少;
- Go 1.16 支持了靜態資源文件的內嵌;
- 標準庫 io/util 廢棄,存量功能遷移到語義更明確的包,比 io 和 os ;
- 標準庫 net 對於域名解析的行爲和 musl-based 的系統一直;
- Unicode 支持升級爲 13.0.0;
更多幹貨:關注公衆號奇伢雲存儲性能