谷歌官方正式發布了Go1.20穩定版「八千字詳解」
Go1.20 變化不少,該版本依然保持 Go1 兼容性,我們可以升級到 Go1.20,而不需要做任何代碼改動。?

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

轉載本文請聯系「 程序員升級打怪之旅」公眾號。






















