距離 Go 1.17 發(fā)布七個月后,Go 1.18 正式發(fā)布了!Go 1.18 是一個包含大量新功能的版本,包括對語言本身做了有史以來最大的改變(泛型)、工具鏈的實現(xiàn)、運行時和庫的更改,還改善了性能。與往常一樣,該版本保持了 Go 1的兼容性承諾:幾乎所有 Go 程序都能像以前一樣繼續(xù)編譯和運行。下面來看一下新版本的一些重大特性:
泛型
以下是關(guān)于 Go 1.18 泛型的最明顯變化的列表,如需更全面的概述請參閱泛型提案,更詳細信息請參閱語言規(guī)范。泛型提案:https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md語言規(guī)范:https://tip.golang.org/ref/spec
函數(shù)和類型聲明的語法,現(xiàn)在接受類型參數(shù)。
參數(shù)化函數(shù)和類型可以通過在方括號中列出類型參數(shù)來實例化。
新標記~已添加到操作符和標點符號中。
接口類型的語法現(xiàn)在允許嵌入任意類型(不僅僅是接口的類型名稱)以及 union 和 ~T 類型元素。,這樣的接口只能用作類型約束。
新的 預(yù)聲明標識符 any是空接口的別名,可以用來代替 interface{}。
新的 預(yù)聲明標識符 comparable是一個接口,表示可以使用==或者 != 比較的所有類型的集合,它只能用作(或嵌入)類型約束。
有三個使用泛型的實驗包可能有用,這些包在 x/exp 存儲庫中;但它們的 API 不在 Go 1 兼容性承諾的保證范圍內(nèi):
golang.org/x/exp/constraints:對通用代碼有用的約束,例如 constraints.Ordered.
golang.org/x/exp/slices:對任何元素類型的切片進行操作的通用函數(shù)集合。
golang.org/x/exp/maps:對任何鍵或元素類型的映射進行操作的通用函數(shù)集合。
當(dāng)前的泛型實現(xiàn)具有以下已知限制:
Go 編譯器無法處理泛型函數(shù)或方法中的類型聲明,計劃在 Go 1.19 中取消這個限制。
Go 編譯器不接受具有預(yù)聲明函數(shù) real、imag 和 complex 的參數(shù)類型的參數(shù),計劃在 Go 1.19 中取消這個限制。
如果 m 由 P 的約束接口顯式聲明,Go 編譯器僅支持在類型參數(shù)類型 P 的值 x 上調(diào)用方法 m。類似地,方法值 x.m 和方法表達式 P.m 也僅在 m 由 P 顯式聲明時才受支持,即使 m 可能在 P 的方法集中,因為 P 中的所有類型都實現(xiàn)了 m,計劃在 Go 1.19 中取消這個限制。
Go 編譯器不支持訪問結(jié)構(gòu)字段 x.f,其中 x 是類型參數(shù)類型,即使類型參數(shù)的類型集中的所有類型都具有字段 f,計劃在 Go 1.19 中取消這個限制。
不允許將類型參數(shù)或指向類型參數(shù)的指針作為結(jié)構(gòu)類型中的未命名字段嵌入,同樣地,也不允許在接口類型中嵌入類型參數(shù)。
具有多個 term 的 union 元素可能不包含具有非空方法集的接口類型。
泛型代表 Go 生態(tài)系統(tǒng)的巨大變化,雖然官方更新了幾個支持泛型的核心工具,但還有很多工作要做。剩余的工具、文檔和庫需要一些時間才能趕上這些語言變化。此外,官方公告中還有這么一段話:
可能會有一些使用泛型的代碼可以在 1.18 版本中使用,但在以后的版本中會中斷。
我們不計劃或期望做出任何此類更改,但是,由于我們今天無法預(yù)見的原因,可能需要在未來版本中破壞 1.18 的程序。
我們鼓勵在有意義的地方使用泛型,但在生產(chǎn)環(huán)境中部署泛型代碼時,請謹慎行事。
(雖然泛型是搞出來了,但很可能有 Bug,不建議在生產(chǎn)中使用)
模糊測試
Go 1.18 包括 fuzzing(模糊測試) 的實現(xiàn),如 fuzzing 提案所述,詳情請參閱 fuzzing 教程(https://go.dev/doc/tutorial/fuzz)以開始使用。
注意,模糊測試會消耗大量內(nèi)存,并且可能會影響機器運行時的性能。
另請注意,模糊引擎在運行時會將擴展測試覆蓋率的值寫入模糊緩存目錄 $GOCACHE/fuzz。目前對可以寫入模糊緩存的文件數(shù)量或總字節(jié)數(shù)沒有限制,因此可能會占用大量存儲空間(可能為 GB 級別)。
編譯器
現(xiàn)在編譯器可以內(nèi)聯(lián)包含范圍循環(huán)或標記為循環(huán)的函數(shù)。
編譯器的類型檢查器被完全替換以支持泛型,一些錯誤消息可能使用與以前不同的措辭(提供更多詳細信息,或以更有用的方式表述)。
由于與支持泛型相關(guān)的編譯器的更改,Go 1.18 的編譯速度可能比 Go 1.17 的編譯速度慢大約 15%,代碼的執(zhí)行時間不受影響,目前計劃在 Go 1.19 中提高編譯器的速度。
Bug fixes
Go 1.18 編譯器可以正確地報告在函數(shù)文本中設(shè)置但從未使用過的變量的錯誤(已聲明但未使用),解決了一個老問題 issue #8560 (https://golang.org/issue/8560)。
Go 1.18 編譯器現(xiàn)在在將如 ‘1’ 《《 32 之類的符文常量表達式作為參數(shù)傳遞給預(yù)聲明函數(shù) print 和 println 時會報告溢出。
Ports
AMD64
Go 1.18 引入了新的GOAMD64環(huán)境變量,它在編譯時選擇 AMD64 架構(gòu)的最低目標版本,允許的值為v1、 v2、v3或v4,默認是v1。
Linux 上的 64 位 RISC-V 架構(gòu)(linux/riscv64 端口)現(xiàn)在支持 c-archive 和 c-shared 構(gòu)建模式。
Linux
Go 1.18 需要 Linux 內(nèi)核版本 2.6.32 或更高版本。
Windows
windows/arm 和 windows/arm64 端在支持非合作搶占,有希望解決在調(diào)用 Win32 函數(shù)時遇到的一些細微的 bug,這些bug在很長一段時間內(nèi)會阻塞。
在 iOS(ios/arm64 端口)和在基于 AMD64 的 macOS(ios/amd64 端口)上運行的 iOS 模擬器上,Go 1.18 現(xiàn)在需要 iOS 12 或更高版本;已停止支持以前的版本。
FreeBSD
Go 1.18 是支持 FreeBSD 11.x 的最后一個版本,Go 1.19 需要 FreeBSD 12.2+ 或 FreeBSD 13.0+。
性能提升
由于 Go1.17 中寄存器 ABI 調(diào)用約定擴展到了 RM64 / Apple M1 / PowerPC 64 架構(gòu),因此 Go1.18 對這幾個架構(gòu)包含了高達 20% 的 CPU 性能提升。該 Go 1.18 版本還包含其他大量更新項,完整更新列表請在發(fā)行公告(https://tip.golang.org/doc/go1.18)中查看。Go 1.18 相關(guān)鏈接
https ://go.dev/dl/
https ://go.dev/doc/go1.18
https ://go.dev/blog/go1.18
https ://go.dev/blog/tutorials-go1.18
原文標題:Go 1.18正式發(fā)布!支持泛型、性能優(yōu)化。..
文章出處:【微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
接口
+關(guān)注
關(guān)注
33文章
8575瀏覽量
151014 -
API
+關(guān)注
關(guān)注
2文章
1499瀏覽量
61959 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569
原文標題:Go 1.18正式發(fā)布!支持泛型、性能優(yōu)化...
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論