8 千字詳解 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
,它們允許設置每個請求的讀寫截止日期。例如:
func RequestHandler(w ResponseWriter, r *Request) {
rc := http.NewResponseController(w)
rc.SetWriteDeadline(time.Time{}) // 發送大響應時禁用 Server.WriteTimeout
io.Copy(w, 大數據)
}
新的 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
使用這些功能的掛鉤 示例是:
proxyHandler := &httputil.ReverseProxy{
重寫:func(r *httputil.ProxyRequest) {
r.SetURL(outboundURL) // 轉發請求到 outboundURL。
r.SetXForwarded() // 設置 X-Forwarded-* 標頭。
r.Out.Header.Set("X-Additional-Header", "代理設置的header")
},
}
ReverseProxy``User-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
新的
CutPrefix
andCutSuffix
函數與 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/x509
ParsePKCS8PrivateKey
現在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.Data``Section.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/big
math/big 包 的廣泛範圍和依賴於輸入的時序使其不適合實現密碼學。標準庫中的加密包不再 對攻擊者控制的輸入調用非平凡的 Int 方法。將來,確定 math/big 中的錯誤是否被視爲安全漏洞將取決於它對標準庫的更廣泛影響。
-
math/rand
math/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``CNAME
Interface.Flags
現在包括新標誌FlagRunning
,表示一個可操作的活動接口。管理配置但不活動的接口(例如,因爲未連接網絡電纜)將FlagUp
設置但不FlagRunning
。新
Dialer.ControlContext
字段包含一個類似於現有Dialer.Control
掛鉤的回調函數,它另外接受撥號上下文作爲參數。 當不爲零Control
時被忽略。ControlContext
Go 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``CONNECT
HTTP 服務器現在接受包含正文的 HEAD 請求,而不是將它們視爲無效而拒絕。
函數返回的 HTTP/2 流錯誤
net/http
可能會轉換爲golang.org/x/net/http2.StreamError
使用errors.As
.前導和尾隨空格從 cookie 名稱中刪除,而不是被拒絕爲無效。例如,“name =value” 的 cookie 設置現在被接受爲設置 cookie“name”。
-
net/netip
new
IPv6LinkLocalAllRouters
andIPv6Loopback
函數net/netip
等同於net.IPv6loopback
andnet.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)
istrue
,Open(p)
則將引用一個文件,該文件在詞法上位於以當前目錄爲根的子樹中。 -
反射 reflect
新的
Value.Comparable
andValue.Equal
方法可用於比較兩個Value
s 是否相等。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
解析器現在返回該錯誤。 -
運行時 / cgo
Go 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 上收集的配置文件現在包含內存映射信息,可修復與位置無關的二進制文件的符號化問題。
-
運行時 / 跟蹤
垃圾收集器的後臺清掃器現在產生的頻率降低了,從而導致執行跟蹤中的無關事件大大減少。
-
字符串
新的
CutPrefix
andCutSuffix
函數與 and 類似TrimPrefix
,TrimSuffix
但也報告字符串是否被修剪。 -
同步
新
Map
方法Swap
、CompareAndSwap
和CompareAndDelete
允許以原子方式更新現有映射條目。 -
系統調用
在 FreeBSD 上,FreeBSD 11 及更早版本所需的兼容性墊片已被刪除。
在 Linux 上,
CLONE_*
定義了附加常量以用於該SysProcAttr.Cloneflags
字段。在 Linux 上,new
SysProcAttr.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 開發大全
參與維護一個非常全面的 Go 開源技術資源庫。日常分享 Go, 雲原生、k8s、Docker 和微服務方面的技術文章和行業動態。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Se7VQaaS66IbR6kAQxRJAw