Go 1.16 釋出說明
Go 1.16 簡介
最新的 Go 版本 1.16 在 Go 1.15 之後六個月釋出。其大部分更改都在工具鏈、執行時和庫的實現中。一如既往,此版本保持了 Go 1 的相容性承諾。我們預計幾乎所有 Go 程式都將像以前一樣繼續編譯和執行。
語言變化
語言沒有變化。
移植
Darwin 和 iOS
Go 1.16 添加了對 macOS 上 64 位 ARM 架構(也稱為 Apple Silicon)的支援,使用 GOOS=darwin, GOARCH=arm64。與 darwin/amd64 移植一樣,darwin/arm64 移植支援 cgo、內部和外部連結、c-archive、c-shared 和 pie 構建模式以及競態檢測器。
之前是 darwin/arm64 的 iOS 移植已重新命名為 ios/arm64。GOOS=ios 意味著 darwin 構建標籤,就像 GOOS=android 意味著 linux 構建標籤一樣。此更改對於使用 gomobile 構建 iOS 應用程式的任何人來說都應該是透明的。
引入 GOOS=ios 意味著像 x_ios.go 這樣的檔名現在將僅為 GOOS=ios 構建;有關詳細資訊,請參閱 go help buildconstraint。使用這種形式檔名的現有包將不得不重新命名這些檔案。
Go 1.16 添加了 ios/amd64 移植,它針對在基於 AMD64 的 macOS 上執行的 iOS 模擬器。以前,這透過 darwin/amd64 並設定 ios 構建標籤得到非官方支援。另請參閱 misc/ios/README,瞭解有關如何為 iOS 和 iOS 模擬器構建程式的詳細資訊。
Go 1.16 是最後一個在 macOS 10.12 Sierra 上執行的版本。Go 1.17 將需要 macOS 10.13 High Sierra 或更高版本。
NetBSD
Go 現在支援 NetBSD 上的 64 位 ARM 架構(netbsd/arm64 移植)。
OpenBSD
Go 現在支援 OpenBSD 上的 MIPS64 架構(openbsd/mips64 移植)。此移植尚不支援 cgo。
在 OpenBSD 上的 64 位 x86 和 64 位 ARM 架構(openbsd/amd64 和 openbsd/arm64 移植)上,系統呼叫現在透過 libc 進行,而不是直接使用 SYSCALL/SVC 指令。這確保了與未來 OpenBSD 版本的向前相容性。特別是,OpenBSD 6.9 及更高版本將要求非靜態 Go 二進位制檔案的系統呼叫透過 libc 進行。
386
如 Go 1.15 釋出說明中宣佈,Go 1.16 放棄了對 x87 模式編譯(GO386=387)的支援。現在可以使用軟浮點模式(GO386=softfloat)支援非 SSE2 處理器。在非 SSE2 處理器上執行的使用者應將 GO386=387 替換為 GO386=softfloat。
RISC-V
linux/riscv64 移植現在支援 cgo 和 -buildmode=pie。此版本還包括 RISC-V 的效能最佳化和程式碼生成改進。
工具
Go 命令
模組
模組感知模式預設啟用,無論當前工作目錄或父目錄中是否存在 go.mod 檔案。更準確地說,GO111MODULE 環境變數現在預設為 on。要切換到以前的行為,請將 GO111MODULE 設定為 auto。
預設情況下,go build 和 go test 等構建命令不再修改 go.mod 和 go.sum。相反,如果需要新增或更新模組要求或校驗和,它們會報告錯誤(就像使用了 -mod=readonly 標誌一樣)。模組要求和總和可以透過 go mod tidy 或 go get 進行調整。
go install 現在接受帶版本字尾的引數(例如,go install example.com/cmd@v1.0.0)。這使得 go install 在模組感知模式下構建和安裝包,如果當前目錄或任何父目錄中有 go.mod 檔案,則忽略它。這對於安裝可執行檔案而不影響主模組的依賴項很有用。
go install,無論是否帶版本字尾(如上所述),現在是模組模式下構建和安裝包的推薦方式。go get 應該與 -d 標誌一起使用,以調整當前模組的依賴項而不構建包,並且使用 go get 構建和安裝包已被棄用。在未來的版本中,-d 標誌將始終啟用。
retract 指令現在可以在 go.mod 檔案中使用,以指示模組的某些已釋出版本不應被其他模組使用。模組作者可以在發現嚴重問題或無意中釋出版本後撤回版本。
go mod vendor 和 go mod tidy 子命令現在接受 -e 標誌,它指示它們在解決缺失包時遇到錯誤時繼續進行。
go 命令現在忽略主模組中被 exclude 指令排除的模組版本的要求。以前,go 命令使用高於排除版本的下一個版本,但該版本可能會隨時間變化,導致不可重現的構建。
在模組模式下,go 命令現在禁止包含非 ASCII 字元或以點字元 (.) 開頭的路徑元素的匯入路徑。帶有這些字元的模組路徑已被禁止(請參閱模組路徑和版本),因此此更改僅影響模組子目錄中的路徑。
嵌入檔案
go 命令現在支援使用新的 //go:embed 指令將靜態檔案和檔案樹作為最終可執行檔案的一部分。有關詳細資訊,請參閱新的 embed 包的文件。
go test
使用 go test 時,如果在執行測試函式期間呼叫 os.Exit(0) 的測試現在將被視為失敗。這將有助於捕獲測試呼叫呼叫 os.Exit(0) 的程式碼並因此停止執行所有未來測試的情況。如果 TestMain 函式呼叫 os.Exit(0),這仍然被視為透過測試。
當 -c 或 -i 標誌與未知標誌一起使用時,go test 會報告錯誤。通常,未知標誌會傳遞給測試,但當使用 -c 或 -i 時,測試不會執行。
go get
go get -insecure 標誌已被棄用,並將在未來版本中刪除。此標誌允許使用 HTTP 等不安全方案從儲存庫獲取並解析自定義域,並繞過使用校驗和資料庫的模組總和驗證。要允許使用不安全方案,請改用 GOINSECURE 環境變數。要繞過模組總和驗證,請使用 GOPRIVATE 或 GONOSUMDB。有關詳細資訊,請參閱 go help environment。
go get example.com/mod@patch 現在要求主模組已經需要 example.com/mod 的某個版本。(然而,go get -u=patch 即使是新新增的依賴項也會繼續修補。)
GOVCS 環境變數
GOVCS 是一個新環境變數,它限制 go 命令可用於下載原始碼的版本控制工具。這可以緩解通常在受信任、經過身份驗證的環境中使用的工具的安全問題。預設情況下,git 和 hg 可用於從任何儲存庫下載程式碼。svn、bzr 和 fossil 只能用於從模組路徑或包路徑與 GOPRIVATE 環境變數中的模式匹配的儲存庫下載程式碼。有關詳細資訊,請參閱 go help vcs。
all 模式
當主模組的 go.mod 檔案宣告 go 1.16 或更高版本時,all 包模式現在僅匹配主模組中發現的包或測試傳遞匯入的那些包。(主模組匯入的包的*測試*匯入的包不再包含在內。)這與自 Go 1.11 以來 go mod vendor 保留的包集相同。
-toolexec 構建標誌
當指定 -toolexec 構建標誌以在呼叫 compile 或 asm 等工具鏈程式時使用程式時,環境變數 TOOLEXEC_IMPORTPATH 現在設定為正在構建的包的匯入路徑。
-i 構建標誌
go build、go install 和 go test 接受的 -i 標誌現已棄用。-i 標誌指示 go 命令安裝命令列上命名的包匯入的包。自 Go 1.10 引入構建快取以來,-i 標誌對構建時間不再有顯著影響,並且當安裝目錄不可寫時,它會導致錯誤。
list 命令
當指定 -export 標誌時,BuildID 欄位現在設定為已編譯包的構建 ID。這等效於在 go list -exported -f {{.Export}} 上執行 go tool buildid,但無需額外的步驟。
-overlay 標誌
-overlay 標誌指定一個 JSON 配置檔案,其中包含一組檔案路徑替換。-overlay 標誌可與所有構建命令和 go mod 子命令一起使用。它主要用於 gopls 等編輯器工具,以瞭解原始碼檔案未儲存更改的影響。配置檔案將實際檔案路徑對映到替換檔案路徑,並且 go 命令及其構建將執行,就像實際檔案路徑存在並具有替換檔案路徑提供的內容,或者如果替換檔案路徑為空則不存在。
Cgo
cgo 工具將不再嘗試將 C 結構位域轉換為 Go 結構欄位,即使它們的大小可以在 Go 中表示。C 位域在記憶體中出現的順序是依賴於實現的,因此在某些情況下,cgo 工具產生了靜默不正確的結果。
Vet
goroutine 中無效使用 testing.T 的新警告
vet 工具現在警告在測試期間建立的 goroutine 中對 testing.T 方法 Fatal 的無效呼叫。這還警告對 testing.T 測試或 testing.B 基準上的 Fatalf、FailNow 和 Skip{,f,Now} 方法的呼叫。
對這些方法的呼叫會停止建立的 goroutine 的執行,而不是 Test* 或 Benchmark* 函式。因此,這些方法要求由執行測試或基準函式的 goroutine 呼叫。例如
func TestFoo(t *testing.T) {
go func() {
if condition() {
t.Fatal("oops") // This exits the inner func instead of TestFoo.
}
...
}()
}
在建立的 goroutine 中呼叫 t.Fatal(或類似方法)的程式碼應重寫為使用 t.Error 發出測試失敗訊號,並使用替代方法(例如使用 return 語句)提前退出 goroutine。前面的例子可以重寫為
func TestFoo(t *testing.T) {
go func() {
if condition() {
t.Error("oops")
return
}
...
}()
}
新的幀指標警告
vet 工具現在警告 amd64 彙編程式碼在不儲存和恢復 BP 暫存器(幀指標)的情況下破壞它,這違反了呼叫約定。不保留 BP 暫存器的程式碼必須修改為根本不使用 BP,或者透過儲存和恢復 BP 來保留 BP。保留 BP 的一個簡單方法是將幀大小設定為非零值,這將導致生成的序言和尾聲為您保留 BP 暫存器。有關示例修復,請參閱 CL 248260。
asn1.Unmarshal 的新警告
vet 工具現在警告向 asn1.Unmarshal 錯誤地傳遞非指標或 nil 引數。這類似於對 encoding/json.Unmarshal 和 encoding/xml.Unmarshal 的現有檢查。
執行時
新的 runtime/metrics 包引入了一個穩定的介面,用於從 Go 執行時讀取實現定義的指標。它取代了現有的函式,如 runtime.ReadMemStats 和 debug.GCStats,並且明顯更通用和高效。有關詳細資訊,請參閱包文件。
將 GODEBUG 環境變數設定為 inittrace=1 現在會使執行時為每個包 init 向標準錯誤輸出一行,總結其執行時間和記憶體分配。此跟蹤可用於查詢 Go 啟動效能中的瓶頸或迴歸。GODEBUG 文件描述了格式。
在 Linux 上,執行時現在預設立即向作業系統釋放記憶體(使用 MADV_DONTNEED),而不是在作業系統記憶體壓力下延遲釋放(使用 MADV_FREE)。這意味著 RSS 等程序級記憶體統計資訊將更準確地反映 Go 程序正在使用的物理記憶體量。目前使用 GODEBUG=madvdontneed=1 來改善記憶體監控行為的系統不再需要設定此環境變數。
Go 1.16 修復了競態檢測器和 Go 記憶體模型之間的一致性問題。競態檢測器現在更精確地遵循記憶體模型的通道同步規則。因此,檢測器現在可能會報告它以前遺漏的競態。
編譯器
編譯器現在可以內聯帶有未標記 for 迴圈、方法值和型別開關的函式。內聯器還可以檢測到更多可以內聯的間接呼叫。
連結器
此版本包括對 Go 連結器的額外改進,減少了連結器資源使用(時間和記憶體)並提高了程式碼的健壯性/可維護性。這些更改構成了兩版本專案下半部分,旨在現代化 Go 連結器。
1.16 中的連結器更改將 1.15 的改進擴充套件到所有受支援的架構/作業系統組合(1.15 的效能改進主要集中在基於 ELF 的作業系統和 amd64 架構上)。對於一組有代表性的大型 Go 程式,連結速度比 1.15 快 20-25%,並且 linux/amd64 的平均記憶體使用減少 5-15%,其他架構和作業系統有更大的改進。由於更積極的符號剪枝,大多數二進位制檔案也更小。
在 Windows 上,go build -buildmode=c-shared 現在預設生成 Windows ASLR DLL。ASLR 可以透過 --ldflags=-aslr=false 停用。
標準庫
嵌入檔案
新的 embed 包提供對編譯期間使用新的 //go:embed directive 嵌入程式中的檔案的訪問。
檔案系統
新的 io/fs 包定義了 fs.FS 介面,它是檔案只讀樹的抽象。標準庫包已根據需要進行了調整以使用該介面。
在介面的生產者端,新的 embed.FS 型別實現了 fs.FS,zip.Reader 也是如此。新的 os.DirFS 函式提供了一個由作業系統檔案樹支援的 fs.FS 實現。
在消費者端,新的 http.FS 函式將 fs.FS 轉換為 http.FileSystem。此外,html/template 和 text/template 包的 ParseFS 函式和方法從 fs.FS 讀取模板。
為了測試實現 fs.FS 的程式碼,新的 testing/fstest 包提供了一個 TestFS 函式,用於檢查並報告常見錯誤。它還提供了一個簡單的記憶體檔案系統實現 MapFS,這對於測試接受 fs.FS 實現的程式碼很有用。
io/ioutil 的棄用
io/ioutil 包已被證明是一個定義不清且難以理解的事物集合。該包提供的所有功能都已移至其他包。io/ioutil 包仍然存在並將繼續像以前一樣工作,但我們鼓勵新程式碼使用 io 和 os 包中的新定義。以下是 io/ioutil 匯出的名稱的新位置列表:
Discard=>io.DiscardNopCloser=>io.NopCloserReadAll=>io.ReadAllReadDir=>os.ReadDir(注意:返回一個os.DirEntry切片而不是fs.FileInfo切片)ReadFile=>os.ReadFileTempDir=>os.MkdirTempTempFile=>os.CreateTempWriteFile=>os.WriteFile
對庫的微小更改
與往常一樣,庫中有各種微小的更改和更新,這些都是在遵守 Go 1 相容性承諾的前提下進行的。
archive/zip
新的 Reader.Open 方法實現了 fs.FS 介面。
crypto/dsa
crypto/dsa 包現已棄用。請參閱 issue #40337。
crypto/hmac
如果雜湊生成函式的單獨呼叫未能返回新值,New 現在將 panic。以前,行為是未定義的,有時會生成無效輸出。
crypto/tls
現在可以使用新的 net.ErrClosed 錯誤檢測關閉或已關閉 TLS 連線上的 I/O 操作。典型的用法是 errors.Is(err, net.ErrClosed)。
在 Conn.Close 中傳送“關閉通知”警報之前,現在設定了預設寫入截止時間,以防止無限期阻塞。
如果伺服器選擇 一個 ALPN 協議,該協議不在 客戶端通告的列表 中,客戶端現在將返回握手錯誤。
如果客戶端或伺服器都沒有 AES 硬體支援,伺服器現在將優先選擇其他可用的 AEAD 密碼套件(例如 ChaCha20Poly1305),而不是 AES-GCM 密碼套件,除非同時設定了 Config.PreferServerCipherSuites 和 Config.CipherSuites。如果客戶端沒有表示對 AES-GCM 密碼套件的偏好,則假定客戶端沒有 AES 硬體支援。
Config.Clone 現在在接收器為 nil 時返回 nil,而不是 panic。
crypto/x509
GODEBUG=x509ignoreCN=0 標誌將在 Go 1.17 中刪除。它啟用了在不存在主題備用名稱時將 X.509 證書上的 CommonName 欄位視為主機名的傳統行為。
ParseCertificate 和 CreateCertificate 現在對 DNSNames、EmailAddresses 和 URIs 欄位強制執行字串編碼限制。這些欄位只能包含 ASCII 範圍內的字元。
CreateCertificate 現在使用簽名者的公鑰驗證生成的證書籤名。如果簽名無效,則返回錯誤,而不是格式錯誤的證書。
不再支援 DSA 簽名驗證。請注意,DSA 簽名生成從未受支援。請參閱 issue #40337。
在 Windows 上,Certificate.Verify 現在將返回由平臺證書驗證器構建的所有證書鏈,而不僅僅是排名最高的鏈。
新的 SystemRootsError.Unwrap 方法允許透過 errors 包函式訪問 Err 欄位。
在 Unix 系統上,crypto/x509 包現在更有效地儲存其系統證書池的副本。只使用少量根的程式將減少大約半兆位元組的記憶體使用。
debug/elf
encoding/asn1
當引數不是指標或為 nil 時,Unmarshal 和 UnmarshalWithParams 現在返回錯誤而不是 panic。此更改與 encoding/json 等其他編碼包的行為一致。
encoding/json
Marshal、Unmarshal 和相關功能理解的 json 結構欄位標籤現在允許 Go 結構欄位的 JSON 物件名稱中包含分號字元。
encoding/xml
編碼器始終注意避免使用以 xml 開頭的名稱空間字首,這些字首是 XML 規範保留的。現在,更嚴格地遵循規範,該檢查不區分大小寫,因此也避免了以 XML、XmL 等開頭的字首。
flag
新的 Func 函式允許註冊透過呼叫函式實現的標誌,作為實現 Value 介面的更輕量級的替代方案。
go/build
Package 結構有新欄位,報告包中 //go:embed 指令的資訊:EmbedPatterns、EmbedPatternPos、TestEmbedPatterns、TestEmbedPatternPos、XTestEmbedPatterns、XTestEmbedPatternPos。
Package 欄位 IgnoredGoFiles 將不再包含以“_”或“.”開頭的檔案,因為這些檔案始終被忽略。IgnoredGoFiles 用於因構建約束而被忽略的檔案。
新的 Package 欄位 IgnoredOtherFiles 包含因構建約束而被忽略的非 Go 檔案列表。
go/build/constraint
新的 go/build/constraint 包解析構建約束行,包括原始的 // +build 語法和將在 Go 1.17 中引入的 //go:build 語法。此包的存在是為了使使用 Go 1.16 構建的工具能夠處理 Go 1.17 原始碼。有關構建約束語法和計劃過渡到 //go:build 語法的詳細資訊,請參閱 https://golang.com.tw/design/draft-gobuild。請注意,Go 1.16 **不支援** //go:build 行,並且不應將其引入 Go 程式。
html/template
新的 template.ParseFS 函式和 template.Template.ParseFS 方法類似於 template.ParseGlob 和 template.Template.ParseGlob,但從 fs.FS 讀取模板。
io
該包現在定義了一個 ReadSeekCloser 介面。
該包現在定義了 Discard、NopCloser 和 ReadAll,用於替代 io/ioutil 包中的同名函式。
log
新的 Default 函式提供對預設 Logger 的訪問。
log/syslog
當記錄到自定義 Unix 域套接字時,Writer 現在使用本地訊息格式(省略主機名並使用較短的時間戳),與預設日誌套接字已使用的格式匹配。
mime/multipart
Reader 的 ReadForm 方法在將最大 int64 值作為限制傳遞時不再拒絕表單資料。
net
關閉的網路連線上的 I/O 操作,或在任何 I/O 完成之前關閉的網路連線上的 I/O 操作,現在可以使用新的 ErrClosed 錯誤進行檢測。典型的用法是 errors.Is(err, net.ErrClosed)。在早期版本中,唯一可靠檢測這種情況的方法是將 Error 方法返回的字串與 "use of closed network connection" 匹配。
在之前的 Go 版本中,Linux 系統上預設的 TCP 偵聽器積壓大小,由 /proc/sys/net/core/somaxconn 設定,最大限制為 65535。在 Linux 核心版本 4.1 及更高版本中,最大值為 4294967295。
在 Linux 上,當 /etc/nsswitch.conf 缺失時,主機名查詢不再在檢查 /etc/hosts 之前使用 DNS;這在基於 musl 的系統上很常見,並使 Go 程式與這些系統上的 C 程式行為一致。
net/http
在 net/http 包中,StripPrefix 的行為已更改為除了從請求 URL 的 Path 欄位之外,還從其 RawPath 欄位中去除字首。在過去的版本中,只修剪了 Path 欄位,因此如果請求 URL 包含任何跳脫字元,URL 將被修改為具有不匹配的 Path 和 RawPath 欄位。在 Go 1.16 中,StripPrefix 修剪這兩個欄位。如果請求 URL 的字首部分中有跳脫字元,則處理程式會返回 404,而不是其以前的舊行為(使用不匹配的 Path/RawPath 對呼叫底層處理程式)。
net/http 包現在拒絕形式為 "Range": "bytes=--N"(其中 "-N" 是負字尾長度,例如 "Range": "bytes=--2")的 HTTP 範圍請求。它現在回覆 416 "Range Not Satisfiable" 響應。
使用 SameSiteDefaultMode 設定的 Cookie 現在根據當前規範(未設定屬性)而不是生成沒有值的 SameSite 鍵來執行。
Client 現在在帶有空主體的 PATCH 請求中傳送顯式 Content-Length: 0 頭,與 POST 和 PUT 的現有行為匹配。
當 HTTPS_PROXY 未設定時,ProxyFromEnvironment 函式不再為 https:// URL 返回 HTTP_PROXY 環境變數的設定。
Transport 型別有一個新欄位 GetProxyConnectHeader,可以將其設定為一個函式,該函式返回在 CONNECT 請求期間傳送到代理的頭部。實際上,GetProxyConnectHeader 是現有欄位 ProxyConnectHeader 的動態版本;如果 GetProxyConnectHeader 不為 nil,則忽略 ProxyConnectHeader。
新的 http.FS 函式將 fs.FS 轉換為 http.FileSystem。
net/http/httputil
ReverseProxy 現在在代理具有未知主體長度的流式響應時更積極地重新整理緩衝資料。
net/smtp
Client 的 Mail 方法現在向支援 SMTPUTF8 指令的伺服器傳送該指令,表明地址以 UTF-8 編碼。
os
當程序已完成時,Process.Signal 現在返回 ErrProcessDone 而不是未匯出的 errFinished。
該包定義了一個新型別 DirEntry 作為 fs.DirEntry 的別名。新的 ReadDir 函式和新的 File.ReadDir 方法可用於將目錄內容讀取為 DirEntry 的切片。File.Readdir 方法(注意 dir 中的小寫 d)仍然存在,返回 FileInfo 的切片,但對於大多數程式來說,切換到 File.ReadDir 會更高效。
該包現在定義了 CreateTemp、MkdirTemp、ReadFile 和 WriteFile,用於替代 io/ioutil 包中定義的函式。
型別 FileInfo、FileMode 和 PathError 現在是 io/fs 包中同名型別的別名。os 包中的函式簽名已更新,以引用 io/fs 包中的名稱。這不應影響任何現有程式碼。
新的 DirFS 函式提供了一個由作業系統檔案樹支援的 fs.FS 實現。
os/signal
新的 NotifyContext 函式允許建立在特定訊號到達時取消的上下文。
path
Match 函式現在在模式不匹配部分存在語法錯誤時返回錯誤。以前,該函式會在匹配失敗時提前返回,因此不會報告模式中任何後續的語法錯誤。
path/filepath
新函式 WalkDir 類似於 Walk,但通常更高效。傳遞給 WalkDir 的函式接收一個 fs.DirEntry 而不是一個 fs.FileInfo。(對於那些記得 Walk 函式接受 os.FileInfo 的人來說,os.FileInfo 現在是 fs.FileInfo 的別名。)
Match 和 Glob 函式現在在模式不匹配部分存在語法錯誤時返回錯誤。以前,這些函式會在匹配失敗時提前返回,因此不會報告模式中任何後續的語法錯誤。
reflect
Zero 函式已最佳化以避免分配。如果程式碼不正確地使用 == 或 DeepEqual 將返回的 Value 與另一個 Value 進行比較,可能會得到與以前的 Go 版本不同的結果。reflect.Value 的文件描述瞭如何正確比較兩個 Value。
runtime/debug
當啟用 SetPanicOnFault 時使用的 runtime.Error 值現在可以有一個 Addr 方法。如果該方法存在,它將返回觸發故障的記憶體地址。
strconv
ParseFloat 現在使用 Eisel-Lemire 演算法,效能提高了兩倍。這也可以加速 encoding/json 等文字格式的解碼。
syscall
NewCallback 和 NewCallbackCDecl 現在正確支援連續具有多個小於 uintptr 大小引數的回撥函式。這可能需要更改這些函式的使用,以消除小引數之間的手動填充。
Windows 上的 SysProcAttr 有一個新的 NoInheritHandles 欄位,該欄位在建立新程序時停用控制代碼繼承。
Windows 上的 DLLError 現在有一個 Unwrap 方法,用於解包其底層錯誤。
在 Linux 上,Setgid、AllThreadsSyscall 和 AllThreadsSyscall6 可用於在程序中的所有 Go 執行緒上進行系統呼叫。這些函式只能由不使用 cgo 的程式使用;如果程式使用 cgo,它們將始終返回 syscall.ENOTSUP。
testing/iotest
新的 ErrReader 函式返回一個始終返回錯誤的 io.Reader。
新的 TestReader 函式測試 io.Reader 的行為是否正確。
text/template
現在,操作分隔符內允許換行符,從而允許操作跨多行。
新的 template.ParseFS 函式和 template.Template.ParseFS 方法類似於 template.ParseGlob 和 template.Template.ParseGlob,但從 fs.FS 讀取模板。
text/template/parse
解析樹中添加了一個新的 CommentNode。parse.Tree 中的 Mode 欄位允許訪問它。
time/tzdata
$GOROOT/lib/time/zoneinfo.zip 中的時區資料庫和此包中的嵌入副本現在使用精簡時區資料格式。這使時區資料庫的大小減少了約 350 KB。
unicode
unicode 包和整個系統中的相關支援已從 Unicode 12.0.0 升級到 Unicode 13.0.0,後者增加了 5,930 個新字元,包括四個新指令碼和 55 個新表情符號。Unicode 13.0.0 還將平面 3 (U+30000-U+3FFFF) 指定為第三表意平面。