谷歌官方正式發(fā)布了Go1.20穩(wěn)定版「八千字詳解」
Go1.20 變化不少,該版本依然保持 Go1 兼容性,我們可以升級到 Go1.20,而不需要做任何代碼改動(dòng)。?
可以使用你任何喜歡的方式升級:
比如:go install golang.org/dl/go1.20@latest
具體的可以參考官網(wǎng)教程:https://go.dev/doc/go1.20
Go 1.20 簡介
最新的 Go 版本 1.20 在Go 1.19 發(fā)布六個(gè)月后發(fā)布。它的大部分更改都在工具鏈、運(yùn)行時(shí)和庫的實(shí)現(xiàn)中。
一如既往,該版本保持了 Go 1的兼容性承諾。我們期望幾乎所有的 Go 程序都能像以前一樣繼續(xù)編譯和運(yùn)行。
語言的變化
Go 1.20 包括對語言的四個(gè)更改。
Go 1.17 添加了從切片到數(shù)組指針的轉(zhuǎn)換。Go 1.20 擴(kuò)展了它以允許從切片到數(shù)組的轉(zhuǎn)換:給定一個(gè)切片x,[4]byte(x)?現(xiàn)在可以寫成*(*[4]byte)(x).
該unsafe?包定義了三個(gè)新函數(shù)SliceData、String和StringData?。與 Go 1.17 一起Slice,這些函數(shù)現(xiàn)在提供了構(gòu)建和解構(gòu)切片和字符串值的完整能力,而不依賴于它們的確切表示。
該規(guī)范現(xiàn)在定義結(jié)構(gòu)值一次比較一個(gè)字段,按照它們在結(jié)構(gòu)類型定義中出現(xiàn)的順序考慮字段,并在第一個(gè)不匹配時(shí)停止。之前可以閱讀規(guī)范,就好像所有字段都需要比較第一個(gè)不匹配之外的字段。類似地,該規(guī)范現(xiàn)在定義數(shù)組值按遞增索引順序一次比較一個(gè)元素。在這兩種情況下,差異會(huì)影響某些比較是否必須恐慌?,F(xiàn)有程序沒有改變:新的規(guī)范措辭描述了實(shí)現(xiàn)一直所做的事情。
可比較的類型(例如普通接口)現(xiàn)在可以滿足comparable?約束,即使類型參數(shù)不是嚴(yán)格可比較的(比較可能會(huì)在運(yùn)行時(shí)崩潰)。這使得實(shí)例化受約束的類型參數(shù)comparable (例如,用戶定義的通用映射鍵的類型參數(shù))與非嚴(yán)格可比較的類型參數(shù)(例如接口類型或包含接口類型的復(fù)合類型)成為可能。
端口
Windows
Go 1.20 是將在 Windows 7、8、Server 2008 和 Server 2012 的任何版本上運(yùn)行的最后一個(gè)版本。Go 1.21 將至少需要 Windows 10 或 Server 2016。
Darwin and iOS
Go 1.20 是將在 macOS 10.13 High Sierra 或 10.14 Mojave 上運(yùn)行的最后一個(gè)版本。Go 1.21 將需要 macOS 10.15 Catalina 或更高版本。
FreeBSD/RISC-V
GOOS=freebsd?Go 1.20 在 RISC-V ( , GOARCH=riscv64) 上添加了對 FreeBSD 的實(shí)驗(yàn)性支持。
工具
Go command
該目錄$GOROOT/pkg?不再存儲(chǔ)標(biāo)準(zhǔn)庫的預(yù)編譯包存檔: go install?不再寫入它們,go?構(gòu)建不再檢查它們,Go 發(fā)行版不再運(yùn)送它們。相反,標(biāo)準(zhǔn)庫中的包是根據(jù)需要構(gòu)建的,并緩存在構(gòu)建緩存中,就像外部的包一樣GOROOT。此更改減少了 Go 發(fā)行版的大小,還避免了使用 cgo 的包的 C 工具鏈傾斜。
實(shí)施go test -json? 已得到改進(jìn),使其更加健壯。運(yùn)行的程序go test -json? 不需要任何更新。直接調(diào)用的程序現(xiàn)在應(yīng)該使用 (例如, 或)而不是普通的來go tool test2json? 運(yùn)行測試二進(jìn)制文件。 -v=test2json``go test -v=test2json``./pkg.test -test.v=test2json``-v
一個(gè)相關(guān)的變化是 在每個(gè)測試程序開始執(zhí)行時(shí)go test -json? 添加了一個(gè)Action?設(shè)置為的事件。start?當(dāng)使用命令運(yùn)行多個(gè)測試時(shí)go,這些啟動(dòng)事件保證以與命令行中指定的包相同的順序發(fā)出。
該go?命令現(xiàn)在定義了體系結(jié)構(gòu)功能構(gòu)建標(biāo)簽,例如amd64.v2?,以允許根據(jù)特定體系結(jié)構(gòu)功能的存在或不存在來選擇包實(shí)現(xiàn)文件。詳情請見go help buildconstraint。
go?子命令現(xiàn)在接受 在執(zhí)行命令之前 將-C <dir>?目錄更改為 <dir>,這對于需要在多個(gè)不同模塊中執(zhí)行命令的腳本可能很有用。
go build?andgo test? 命令不再接受-i標(biāo)志,該標(biāo)志自 Go 1.16 以來已 被棄用。
該go generate?命令現(xiàn)在接受 -skip <pattern>?跳過//go:generate?匹配的指令<pattern>。
該go test?命令現(xiàn)在接受 -skip <pattern>?跳過測試、子測試或匹配的示例<pattern>。
當(dāng)主模塊位于 中GOPATH/src?時(shí), go install?不再為非main?包安裝庫GOPATH/pkg?,并且go list?不再報(bào)告Target? 此類包的字段。(在模塊模式下,已編譯的包僅存儲(chǔ)在 構(gòu)建緩存中 ,但一個(gè)錯(cuò)誤導(dǎo)致GOPATH安裝目標(biāo)意外地保持有效。)
go build和go install?其他與構(gòu)建相關(guān)的命令現(xiàn)在支持-pgo?啟用配置文件引導(dǎo)優(yōu)化的標(biāo)志,這在下面的 編譯器部分中有更詳細(xì)的描述。該-pgo?標(biāo)志指定配置文件的文件路徑。指定-pgo=auto?會(huì)導(dǎo)致go?命令搜索default.pgo?在主包目錄中命名的文件,如果存在則使用它。此模式目前需要在命令行上指定一個(gè)主包,但我們計(jì)劃在未來的版本中取消此限制。指定-pgo=off關(guān)閉配置文件引導(dǎo)的優(yōu)化。
go build和go install?其他與構(gòu)建相關(guān)的命令現(xiàn)在支持-cover 使用代碼覆蓋檢測構(gòu)建指定目標(biāo)的標(biāo)志。這在下面的封面部分 中有更詳細(xì)的描述 。
go version
該go version -m?命令現(xiàn)在支持讀取更多類型的 Go 二進(jìn)制文件,最值得注意的是,使用構(gòu)建的 Windows DLLgo build -buildmode=c-shared 和沒有執(zhí)行權(quán)限的 Linux 二進(jìn)制文件。
CGO
該go?命令現(xiàn)在默認(rèn)在沒有 C 工具鏈的系統(tǒng)上禁用cgo?。更具體地說,當(dāng)CGO_ENABLED?環(huán)境變量未設(shè)置時(shí),環(huán)境變量未設(shè)置,并且在路徑中找不到 CC?默認(rèn)的 C 編譯器(通常是clang?或),默認(rèn)為. 與往常一樣,您可以通過顯式設(shè)置來覆蓋默認(rèn)值。 gcc``CGO_ENABLED``0``CGO_ENABLED
默認(rèn)更改最重要的影響是,當(dāng) Go 安裝在沒有 C 編譯器的系統(tǒng)上時(shí),它現(xiàn)在將使用純 Go 構(gòu)建標(biāo)準(zhǔn)庫中使用 cgo 的包,而不是使用預(yù)分發(fā)的包存檔(有已被刪除,如上所述)或嘗試使用 cgo 并失敗。這使得 Go 在一些最小的容器環(huán)境以及 macOS 上工作得更好,在 macOS 上,自 Go 1.16 以來,預(yù)分發(fā)的包存檔還沒有用于基于 cgo 的包。
標(biāo)準(zhǔn)庫中使用 cgo 的包有net?、 os/user?和 plugin?。在 macOS 上,net和os/user?包已被重寫為不使用 cgo:相同的代碼現(xiàn)在用于 cgo 和非 cgo 構(gòu)建以及交叉編譯的構(gòu)建。在 Windows 上,net和os/user包從未使用過 cgo。在其他系統(tǒng)上,禁用 cgo 的構(gòu)建將使用這些包的純 Go 版本。
在 macOS 上,競態(tài)檢測器已被重寫為不使用 cgo:啟用競態(tài)檢測器的程序可以在沒有 Xcode 的情況下構(gòu)建和運(yùn)行。在 Linux 和其他 Unix 系統(tǒng)以及 Windows 上,需要主機(jī) C 工具鏈才能使用競爭檢測器。
Cover
Go 1.20 支持收集程序(應(yīng)用程序和集成測試)的代碼覆蓋率配置文件,而不僅僅是單元測試。
要收集程序的覆蓋率數(shù)據(jù),請使用go build的-cover?標(biāo)志構(gòu)建它,然后運(yùn)行生成的二進(jìn)制文件,并將環(huán)境變量GOCOVERDIR設(shè)置為覆蓋率配置文件的輸出目錄。有關(guān)如何開始的更多信息,請參閱 “集成測試覆蓋率”登錄頁面。詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)見 提案。
Vet
改進(jìn)了嵌套函數(shù)對循環(huán)變量捕獲的檢測
該工具現(xiàn)在報(bào)告 在子測試函數(shù)體內(nèi)vet?調(diào)用后對循環(huán)變量的引用。T.Parallel()此類引用可能會(huì)觀察來自不同迭代的變量值(通常會(huì)導(dǎo)致測試用例被跳過)或由于不同步的并發(fā)訪問而導(dǎo)致的無效狀態(tài)。
該工具還在更多地方檢測引用錯(cuò)誤。以前它只會(huì)考慮循環(huán)體的最后一條語句,但現(xiàn)在它遞歸地檢查 if、switch 和 select 語句中的最后一條語句。
針對錯(cuò)誤時(shí)間格式的新診斷
vet 工具現(xiàn)在報(bào)告使用時(shí)間格式 2006-02-01 (yyyy-dd-mm)Time.Format?和 time.Parse。此格式未出現(xiàn)在通用日期標(biāo)準(zhǔn)中,但在嘗試使用 ISO 8601 日期格式 (yyyy-mm-dd) 時(shí)經(jīng)常被錯(cuò)誤使用。
Runtime
一些垃圾收集器的內(nèi)部數(shù)據(jù)結(jié)構(gòu)被重新組織,以提高空間和 CPU 效率。此更改減少了內(nèi)存開銷并將整體 CPU 性能提高了 2%。
在某些情況下,垃圾收集器在 goroutine 協(xié)助方面表現(xiàn)得不太不穩(wěn)定。
Go 1.20 添加了一個(gè)runtime/coverage?包含 API 的新包,用于在運(yùn)行時(shí)從長時(shí)間運(yùn)行和/或不通過os.Exit().
編譯器 Compiler
Go 1.20 添加了對配置文件引導(dǎo)優(yōu)化 (PGO) 的預(yù)覽支持。PGO 使工具鏈能夠根據(jù)運(yùn)行時(shí)配置文件信息執(zhí)行特定于應(yīng)用程序和工作負(fù)載的優(yōu)化。目前,編譯器支持 pprof CPU 配置文件,可以通過常規(guī)方式收集,例如runtime/pprof?或 net/http/pprof?包。要啟用 PGO,請通過 -pgo?標(biāo)志將 pprof 配置文件的路徑傳遞給go build,如上所述。Go 1.20 使用 PGO 更積極地在熱調(diào)用站點(diǎn)內(nèi)聯(lián)函數(shù)。一組具有代表性的 Go 程序的基準(zhǔn)顯示啟用配置文件引導(dǎo)的內(nèi)聯(lián)優(yōu)化可將性能提高約 3–4%。請參閱PGO 用戶指南獲取詳細(xì)文檔。我們計(jì)劃在未來的版本中添加更多配置文件引導(dǎo)的優(yōu)化。請注意,配置文件引導(dǎo)的優(yōu)化是一個(gè)預(yù)覽,因此請謹(jǐn)慎使用。
Go 1.20 編譯器升級了它的前端以使用一種新的方式來處理編譯器的內(nèi)部數(shù)據(jù),它修復(fù)了幾個(gè)泛型類型問題并在泛型函數(shù)和方法中啟用了類型聲明。
編譯器現(xiàn)在 默認(rèn)拒絕帶有編譯器錯(cuò)誤的匿名接口循環(huán)。這些源于嵌入式接口的巧妙使用, 并且一直存在細(xì)微的正確性問題,但我們沒有證據(jù)表明它們確實(shí)在實(shí)踐中使用過。假設(shè)沒有用戶報(bào)告受到此更改的不利影響,我們計(jì)劃更新 Go 1.22 的語言規(guī)范以正式禁止它們,以便工具作者也可以停止支持它們。
Go 1.18 和 1.19 的構(gòu)建速度有所下降,這主要是由于增加了對泛型的支持和后續(xù)工作。Go 1.20 將構(gòu)建速度提高了 10%,使其與 Go 1.17 保持一致。相對于 Go 1.19,生成的代碼性能也普遍略有提升。
鏈接器 Linker
glibc? 在 Linux 上,鏈接器現(xiàn)在為鏈接時(shí)或musl在鏈接時(shí) 選擇動(dòng)態(tài)解釋器。
在 Windows 上,Go 鏈接器現(xiàn)在支持現(xiàn)代的基于 LLVM 的 C 工具鏈。
Go 1.20 對編譯器生成的符號(hào)使用go:?andtype:?前綴,而不是go.?and type.?。這避免了名稱以 . 開頭的用戶包的混淆go.?。該debug/gosym軟件包理解使用 Go 1.20 及更新版本構(gòu)建的二進(jìn)制文件的新命名約定。
引導(dǎo)程序 Bootstrap
當(dāng)從源代碼構(gòu)建 Go 版本GOROOT_BOOTSTRAP?且未設(shè)置時(shí),以前版本的 Go 在目錄中查找 Go 1.4 或更高版本的引導(dǎo)工具鏈 $HOME/go1.4(%HOMEDRIVE%%HOMEPATH%\go1.4?在 Windows 上)。Go 1.18 和 Go 1.19在回退到 之前首先尋找$HOME/go1.17?或,以預(yù)期在引導(dǎo) Go 1.20 時(shí)需要使用 Go 1.17。Go 1.20 確實(shí)需要 Go 1.17 版本來進(jìn)行引導(dǎo),但我們意識(shí)到我們應(yīng)該采用引導(dǎo)工具鏈的最新點(diǎn)版本,因此它需要 Go 1.17.13。Go 1.20 尋找或 回退到之前$HOME/sdk/go1.17``$HOME/go1.4``$HOME/go1.17.13``$HOME/sdk/go1.17.13``$HOME/go1.4 (以支持硬編碼路徑 $HOME/go1.4 但在那里安裝了更新的 Go 工具鏈的系統(tǒng))。未來,我們計(jì)劃大約每年將引導(dǎo)工具鏈向前移動(dòng)一次,特別是我們預(yù)計(jì) Go 1.22 將需要 Go 1.20 的最終版本來進(jìn)行引導(dǎo)。
核心庫
New crypto/ecdh package
Go 1.20 添加了一個(gè)新crypto/ecdh包,以明確支持 NIST 曲線和 Curve25519 上的橢圓曲線 Diffie-Hellman 密鑰交換。
程序應(yīng)該為 ECDH 使用crypto/ecdh?而不是低級功能 crypto/elliptic,而為更高級的用例使用第三方模塊。
包裝多個(gè)錯(cuò)誤
Go 1.20 擴(kuò)展了對錯(cuò)誤包裝的支持,允許一個(gè)錯(cuò)誤包裝多個(gè)其他錯(cuò)誤。
一個(gè)錯(cuò)誤e?可以通過提供一個(gè)Unwrap?返回[]error.
和函數(shù)已更新以檢查多重包裝錯(cuò)誤 errors.Is?。 errors.As
該fmt.Errorf?函數(shù)現(xiàn)在支持多次出現(xiàn)%w格式動(dòng)詞,這將導(dǎo)致它返回一個(gè)包含所有這些錯(cuò)誤操作數(shù)的錯(cuò)誤。
新函數(shù)errors.Join 返回一個(gè)包含錯(cuò)誤列表的錯(cuò)誤。
HTTP 響應(yīng)控制器
新 "net/http".ResponseController? 類型提供對接口未處理的擴(kuò)展的按請求功能的 "net/http".ResponseWriter訪問。
以前,我們通過定義ResponseWriter?可以實(shí)現(xiàn)的可選接口(例如 Flusher. 這些接口不可發(fā)現(xiàn)且使用起來很笨拙。
該ResponseController?類型提供了一種更清晰、更易于發(fā)現(xiàn)的方式來添加每個(gè)處理程序的控件。Go 1.20 中還添加了兩個(gè)這樣的控件是 SetReadDeadline和SetWriteDeadline,它們允許設(shè)置每個(gè)請求的讀寫截止日期。例如:
新的 ReverseProxy 重寫hook
httputil.ReverseProxy? 轉(zhuǎn)發(fā)代理包括一個(gè)新的 鉤子Rewrite? 函數(shù),取代了以前的Director鉤子。
該Rewrite?掛鉤接受一個(gè) ProxyRequest?參數(shù),該參數(shù)包括代理接收的入站請求和它將發(fā)送的出站請求。與Director?僅對出站請求進(jìn)行操作的掛鉤不同,這允許Rewrite掛鉤避免某些情況,在這些情況下,惡意入站請求可能導(dǎo)致掛鉤添加的標(biāo)頭在轉(zhuǎn)發(fā)之前被刪除。請參閱問題 #50580。
該P(yáng)roxyRequest.SetURL? 方法將出站請求路由到提供的目的地并取代該NewSingleHostReverseProxy?功能。與 不同的NewSingleHostReverseProxy?是,SetURL? 還設(shè)置了Host出站請求的標(biāo)頭。
該 ProxyRequest.SetXForwarded? 方法設(shè)置出站請求的X-Forwarded-For、X-Forwarded-Host和X-Forwarded-Proto?標(biāo)頭。使用 aRewrite時(shí),默認(rèn)情況下不會(huì)添加這些標(biāo)頭。
Rewrite使用這些功能的掛鉤 示例是:
ReverseProxyUser-Agent當(dāng)傳入請求沒有時(shí), 不再向轉(zhuǎn)發(fā)的請求添加標(biāo)頭。
library的小改動(dòng)
與往常一樣,庫有各種小的變化和更新,考慮到 Go 1的兼容性承諾 。還有各種性能提升,這里就不一一列舉了。
- archive/tar設(shè)置GODEBUG=tarinsecurepath=0環(huán)境變量后, Reader.Next方法現(xiàn)在將返回ErrInsecurePath 文件名為絕對路徑的條目的錯(cuò)誤,指的是當(dāng)前目錄之外的位置,包含無效字符,或者(在 Windows 上)是保留名稱,例如NUL. Go 的未來版本可能會(huì)默認(rèn)禁用不安全的路徑。
- archive/zip設(shè)置GODEBUG=zipinsecurepath=0環(huán)境變量后, NewReader現(xiàn)在將 ErrInsecurePath 在打開包含絕對路徑的任何文件名的存檔時(shí)返回錯(cuò)誤,指的是當(dāng)前目錄之外的位置,包含無效字符,或者(在 Windows 上)是保留名稱,例如作為NUL。Go 的未來版本可能會(huì)默認(rèn)禁用不安全的路徑。從包含文件數(shù)據(jù)的目錄文件中讀取現(xiàn)在將返回錯(cuò)誤。zip 規(guī)范不允許目錄文件包含文件數(shù)據(jù),因此此更改僅影響從無效存檔中讀取。
- bytes新的 CutPrefixand CutSuffix函數(shù)與 and 類似TrimPrefix ,TrimSuffix 但也報(bào)告字符串是否被修剪。新Clone函數(shù)分配字節(jié)切片的副本。
- context新WithCancelCause函數(shù)提供了一種方法來取消具有給定錯(cuò)誤的上下文??梢酝ㄟ^調(diào)用新Cause函數(shù)來檢索該錯(cuò)誤。
- crypto/ecdsa使用支持的曲線時(shí),所有操作現(xiàn)在都在恒定時(shí)間內(nèi)實(shí)現(xiàn)。這導(dǎo)致 CPU 時(shí)間增加 5% 到 30%,主要影響 P-384 和 P-521。新PrivateKey.ECDH方法將 an 轉(zhuǎn)換ecdsa.PrivateKey為ecdh.PrivateKey.
- crypto/ed25519該P(yáng)rivateKey.Sign方法和 VerifyWithOptions函數(shù)現(xiàn)在支持使用 Ed25519ph 對預(yù)散列消息進(jìn)行簽名,由 Options.HashFunc 返回 crypto.SHA512. 他們現(xiàn)在還支持帶有上下文的 Ed25519ctx 和 Ed25519ph,通過設(shè)置新 Options.Context 字段來指示。
- crypto/RSA新字段OAEPOptions.MGFHash 允許為 OAEP 解密單獨(dú)配置 MGF1 哈希。crypto/rsa 現(xiàn)在使用一個(gè)新的、更安全的、恒定時(shí)間的后端。這會(huì)導(dǎo)致解密操作的 CPU 運(yùn)行時(shí)間增加大約 15%(amd64 上的 RSA-2048)和 45%(arm64 上的 RSA-4096),在 32 位架構(gòu)上更多。加密操作比以前慢了大約 20 倍(但仍然比解密快 5-10 倍)。性能有望在未來的版本中得到改善。程序不得修改或手動(dòng)生成 的字段 PrecomputedValues。
- crypto/subtle新函數(shù)XORBytes 將兩個(gè)字節(jié)片異或在一起。
- crypto/TLS已解析的證書現(xiàn)在在所有主動(dòng)使用該證書的客戶端之間共享。在與共享其證書鏈的任何部分的服務(wù)器或服務(wù)器集合建立許多并發(fā)連接的程序中,內(nèi)存節(jié)省可能非常重要。對于由于證書驗(yàn)證失敗而導(dǎo)致的握手失敗,TLS 客戶端和服務(wù)器現(xiàn)在返回一個(gè)新類型的錯(cuò)誤 CertificateVerificationError,其中包括提供的證書。
- crypto/x509ParsePKCS8PrivateKey? 現(xiàn)在 MarshalPKCS8PrivateKey 支持類型的鍵*crypto/ecdh.PrivateKey。 ParsePKIXPublicKey 現(xiàn)在 MarshalPKIXPublicKey 支持類型的鍵*crypto/ecdh.PublicKey。解析 NIST 曲線鍵仍然返回類型 *ecdsa.PublicKey和的值*ecdsa.PrivateKey。使用他們的新ECDH方法轉(zhuǎn)換為crypto/ecdh類型。新SetFallbackRoots 功能允許程序定義一組備用根證書,以防操作系統(tǒng)驗(yàn)證程序或標(biāo)準(zhǔn)平臺(tái)根包在運(yùn)行時(shí)不可用。它最常與新包golang.org/x/crypto/x509roots/fallback一起使用,它將提供最新的根包。
- debug/elf嘗試使用現(xiàn)在返回 的讀取器或讀取器讀取SHT_NOBITS部分 會(huì) 返回錯(cuò)誤。 Section.DataSection.Open定義了其他R_LARCH_*常量以用于 LoongArch 系統(tǒng)。定義了其他R_PPC64_*常量以用于 PPC64 ELFv2 重定位。的常量值R_PPC64_SECTOFF_LO_DS已從 61 更正為 62。
- debug/gosym由于Go 的符號(hào)命名約定發(fā)生了變化,處理 Go 二進(jìn)制文件的工具應(yīng)該使用 Go 1.20 的debug/gosym包來透明地處理新舊二進(jìn)制文件。
- debug/PE定義了其他IMAGE_FILE_MACHINE_RISCV*常量以用于 RISC-V 系統(tǒng)。
- 編碼/二進(jìn)制ReadVarint?和 ReadUvarint 函數(shù)現(xiàn)在將 在io.ErrUnexpectedEOF讀取部分值后返回,而不是io.EOF.
- encoding/xml新Encoder.Close方法可用于在完成編碼時(shí)檢查未閉合的元素。解碼器現(xiàn)在拒絕具有多個(gè)冒號(hào)的元素和屬性名稱,例如<a:b:c>,以及解析為空字符串的命名空間,例如xmlns:a="".解碼器現(xiàn)在拒絕在開始和結(jié)束標(biāo)記中使用不同命名空間前綴的元素,即使這些前綴都表示相同的命名空間。
- 錯(cuò)誤新Join函數(shù)返回一個(gè)包含錯(cuò)誤列表的錯(cuò)誤。
- 調(diào)速器該Errorf函數(shù)支持格式動(dòng)詞的多次出現(xiàn)%w,返回一個(gè)錯(cuò)誤,該錯(cuò)誤解包到所有參數(shù)的列表%w。新FormatString函數(shù)恢復(fù)對應(yīng)于 a 的格式化指令State,這在Formatter. 實(shí)施。
- go/ast新RangeStmt.Range字段記錄range關(guān)鍵字在范圍語句中的位置。新增的File.FileStart andFile.FileEnd字段記錄了整個(gè)源文件的開始和結(jié)束位置。
- go/token令牌新FileSet.RemoveFile方法從FileSet. 長時(shí)間運(yùn)行的程序可以使用它來釋放與它們不再需要的文件關(guān)聯(lián)的內(nèi)存。
- go/types新Satisfies函數(shù)報(bào)告類型是否滿足約束。 此更改與區(qū)分滿足約束和實(shí)現(xiàn)接口 的新語言語義一致。
- IO新OffsetWriter包裝底層 WriterAt 并提供Seek、Write和WriteAt方法,將其有效文件偏移位置調(diào)整固定量。
- 讀寫器新錯(cuò)誤 立即但成功 SkipAll 終止。WalkDir
- math/bigmath/big包 的廣泛范圍和依賴于輸入的時(shí)序使其不適合實(shí)現(xiàn)密碼學(xué)。標(biāo)準(zhǔn)庫中的加密包不再 對攻擊者控制的輸入調(diào)用非平凡的Int方法。將來,確定 math/big 中的錯(cuò)誤是否被視為安全漏洞將取決于它對標(biāo)準(zhǔn)庫的更廣泛影響。
- math/randmath/rand包 現(xiàn)在自動(dòng)為全局隨機(jī)數(shù)生成器(由 和 等頂級函數(shù)使用Float64)Int生成一個(gè)隨機(jī)值,并且頂級Seed函數(shù)已被棄用。需要可重現(xiàn)的隨機(jī)數(shù)序列的程序應(yīng)該更喜歡分配自己的隨機(jī)源,使用rand.New(rand.NewSource(seed)).需要較早一致的全局播種行為的程序可以 GODEBUG=randautoseed=0在其環(huán)境中設(shè)置。頂層Read函數(shù)已被棄用。幾乎在所有情況下, crypto/rand.Read都是更合適的。
- mime該P(yáng)arseMediaType函數(shù)現(xiàn)在允許重復(fù)參數(shù)名稱,只要名稱的值相同即可。
- mime/multipart該Reader類型的方法現(xiàn)在包裝了底層返回的錯(cuò)誤io.Reader。
- net該函數(shù)現(xiàn)在在記錄存在時(shí)LookupCNAME 始終如一地返回記錄的內(nèi)容。CNAME以前在 Unix 系統(tǒng)上,當(dāng)使用純 Go 解析器時(shí),如果記錄引用的名稱沒有、 或記錄,LookupCNAME則會(huì)返回錯(cuò)誤。此更改會(huì)修改 以匹配 Windows 上的先前行為,從而允許在存在時(shí)成功 。 CNAME``A``AAAA``CNAME``LookupCNAME``LookupCNAME``CNAMEInterface.Flags?現(xiàn)在包括新標(biāo)志FlagRunning,表示一個(gè)可操作的活動(dòng)接口。管理配置但不活動(dòng)的接口(例如,因?yàn)槲催B接網(wǎng)絡(luò)電纜)將FlagUp設(shè)置但不FlagRunning。新Dialer.ControlContext字段包含一個(gè)類似于現(xiàn)有Dialer.Control掛鉤的回調(diào)函數(shù),它另外接受撥號(hào)上下文作為參數(shù)。 當(dāng)不為零 Control時(shí)被忽略。ControlContextGo DNS 解析器識(shí)別trust-ad解析器選項(xiàng)。當(dāng)在options trust-ad中設(shè)置時(shí)resolv.conf,Go 解析器將在 DNS 查詢中設(shè)置 AD 位。解析器不在響應(yīng)中使用 AD 位。DNS 解析將檢測更改/etc/nsswitch.conf 并在更改時(shí)重新加載文件。最多每五秒進(jìn)行一次檢查,與之前對/etc/hosts 和的處理相匹配/etc/resolv.conf。
- 網(wǎng)絡(luò)/http該ResponseWriter.WriteHeader功能現(xiàn)在支持發(fā)送 1xx狀態(tài)代碼。新的Server.DisableGeneralOptionsHandler配置設(shè)置允許禁用默認(rèn)OPTIONS *處理程序。當(dāng)從代理接收到請求的 HTTP 響應(yīng)Transport.OnProxyConnectResponse時(shí),將調(diào)用 新掛鉤。 Transport``CONNECTHTTP 服務(wù)器現(xiàn)在接受包含正文的 HEAD 請求,而不是將它們視為無效而拒絕。函數(shù)返回的 HTTP/2 流錯(cuò)誤net/http可能會(huì)轉(zhuǎn)換為golang.org/x/net/http2.StreamError使用 errors.As.前導(dǎo)和尾隨空格從 cookie 名稱中刪除,而不是被拒絕為無效。例如,“name =value”的 cookie 設(shè)置現(xiàn)在被接受為設(shè)置 cookie“name”。
- net/netipnew IPv6LinkLocalAllRouters andIPv6Loopback函數(shù)net/netip等同于 net.IPv6loopbackand net.IPv6linklocalallrouters。
- pkg在 Windows 上,該名稱NUL不再被視為 和 中的 Mkdir特例 Stat。在 Windows 上,F(xiàn)ile.Stat 當(dāng)文件是目錄時(shí),現(xiàn)在使用文件句柄檢索屬性。以前它會(huì)使用傳遞給的路徑 Open,如果文件已被移動(dòng)或替換,則該路徑可能不再是文件句柄所代表的文件。此更改修改Open為沒有訪問權(quán)限的打開目錄 FILE_SHARE_DELETE,這與常規(guī)文件的行為相匹配。在 Windows 上,F(xiàn)ile.Seek現(xiàn)在支持查找到目錄的開頭。
- 操作系統(tǒng)/執(zhí)行新Cmd字段 Cancel并 WaitDelay 指定Cmd當(dāng)其關(guān)聯(lián) Context被取消或其進(jìn)程退出時(shí) I/O 管道仍由子進(jìn)程保持打開狀態(tài)時(shí)的行為。
- 路徑/文件路徑新錯(cuò)誤 立即但成功 SkipAll 終止。Walk新IsLocal函數(shù)報(bào)告路徑是否是目錄的詞法本地路徑。例如,如果IsLocal(p)is true,Open(p)則將引用一個(gè)文件,該文件在詞法上位于以當(dāng)前目錄為根的子樹中。
- 反射 reflect新的Value.Comparableand Value.Equal方法可用于比較兩個(gè)Values 是否相等。 Comparable報(bào)告Equal給定Value接收器的操作是否有效。新Value.Grow方法擴(kuò)展了一個(gè)切片以保證其他n元素的空間。新Value.SetZero方法將一個(gè)值設(shè)置為其類型的零值。Go 1.18 引入Value.SetIterKey 和Value.SetIterValue方法。這些是優(yōu)化:v.SetIterKey(it)意味著等同于v.Set(it.Key()). 這些實(shí)現(xiàn)錯(cuò)誤地忽略了對未優(yōu)化表單中存在的未導(dǎo)出字段的使用檢查。Go 1.20 更正了這些方法以包括未導(dǎo)出的字段檢查。
- 正則表達(dá)式Go 1.19.2 和 Go 1.18.7 包含對正則表達(dá)式解析器的安全修復(fù),使其拒絕會(huì)消耗過多內(nèi)存的非常大的表達(dá)式。因?yàn)?Go 補(bǔ)丁版本沒有引入新的 API,所以syntax.ErrInternalError在這種情況下返回的解析器。Go 1.20 添加了一個(gè)更具體的錯(cuò)誤,syntax.ErrLarge解析器現(xiàn)在返回該錯(cuò)誤。
- 運(yùn)行時(shí)/cgoGo 1.20 添加了新的Incomplete標(biāo)記類型。cgo 生成的代碼將用于cgo.Incomplete標(biāo)記不完整的 C 類型。
- 運(yùn)行時(shí)/指標(biāo)Go 1.20 添加了新的支持指標(biāo),包括當(dāng)前GOMAXPROCS設(shè)置 ( /sched/gomaxprocs:threads)、執(zhí)行的 cgo 調(diào)用次數(shù) ( /cgo/go-to-c-calls:calls)、互斥塊總時(shí)間 ( /sync/mutex/wait/total:seconds) 以及垃圾收集中花費(fèi)的各種時(shí)間度量?;跁r(shí)間的直方圖指標(biāo)現(xiàn)在不太精確,但占用的內(nèi)存少得多。
- 運(yùn)行時(shí)間/pprof互斥配置文件樣本現(xiàn)在已預(yù)先縮放,解決了如果采樣率在執(zhí)行期間發(fā)生變化,舊的互斥配置文件樣本將被錯(cuò)誤縮放的問題。在 Windows 上收集的配置文件現(xiàn)在包含內(nèi)存映射信息,可修復(fù)與位置無關(guān)的二進(jìn)制文件的符號(hào)化問題。
- 運(yùn)行時(shí)/跟蹤垃圾收集器的后臺(tái)清掃器現(xiàn)在產(chǎn)生的頻率降低了,從而導(dǎo)致執(zhí)行跟蹤中的無關(guān)事件大大減少。
- 字符串新的 CutPrefixand CutSuffix函數(shù)與 and 類似TrimPrefix ,TrimSuffix 但也報(bào)告字符串是否被修剪。
- 同步新Map方法Swap、 CompareAndSwap和 CompareAndDelete 允許以原子方式更新現(xiàn)有映射條目。
- 系統(tǒng)調(diào)用在 FreeBSD 上,F(xiàn)reeBSD 11 及更早版本所需的兼容性墊片已被刪除。在 Linux 上,CLONE_*定義了附加常量以用于該SysProcAttr.Cloneflags字段。在 Linux 上,newSysProcAttr.CgroupFD 和SysProcAttr.UseCgroupFD字段提供了一種將子進(jìn)程放入特定 cgroup 的方法。
- 測試新方法B.Elapsed 報(bào)告基準(zhǔn)的當(dāng)前經(jīng)過時(shí)間,這可能有助于計(jì)算使用 報(bào)告的速率ReportMetric。
- 時(shí)間新的時(shí)間布局常量DateTime、 DateOnly和 TimeOnly 為公共 Go 源代碼調(diào)查中使用的三個(gè)最常見的布局字符串提供了名稱。新Time.Compare方法比較兩次。Parse? 現(xiàn)在忽略其輸入中的亞納秒精度,而不是將這些數(shù)字報(bào)告為錯(cuò)誤。該Time.MarshalJSON方法現(xiàn)在更加嚴(yán)格地遵守 RFC 3339。
- 統(tǒng)一碼/utf16新 AppendRune 函數(shù)將給定符文的 UTF-16 編碼附加到 uint16 切片,類似于utf8.AppendRune.
本文轉(zhuǎn)載自微信公眾號(hào)「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關(guān)注。
轉(zhuǎn)載本文請聯(lián)系「 程序員升級打怪之旅」公眾號(hào)。