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=darwinGOARCH=arm64。與 darwin/amd64 移植相同,darwin/arm64 移植支援 cgo、內部和外部連結、c-archivec-sharedpie 建置模式,以及競爭偵測器。

先前稱為 darwin/arm64 的 iOS 移植已重新命名為 ios/arm64GOOS=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 模擬器。先前透過設定 ios 建構標記來透過 darwin/amd64 非正式支援這項功能。有關如何建構 iOS 和 iOS 模擬器程式碼的詳細資訊,另請參閱 misc/ios/README

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/amd64openbsd/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 buildgo test 之類的建置指令,預設不會再修改 go.modgo.sum。相反地,如果需要新增或更新模組需求或驗證碼時,將會回報錯誤 (就好像使用 -mod=readonly 旗標一樣)。模組需求和驗證碼可以用 go mod tidygo get 調整。

go install 現在接受加入版本字尾的參數 (例如 go install example.com/cmd@v1.0.0)。這會使 go install 在考量模組的模式底下建置和安裝套件,無視當前目錄或任何父目錄 (如果有) 中的 go.mod 檔案。這對於在不受主要模組依存關係影響下安裝可執行檔非常有用。

使用或不使用版本字尾 (如上所述) 的 go install 現在是建議在模組模式下建置和安裝套件的方式。go get 應與 -d 旗標搭配使用,才能調整當前模組的依存關係而不用建置套件,而使用 go get 建置和安裝套件的方式已不建議使用。在未來的版本中,-d 旗標將會永遠啟用。

現在可以在 go.mod 檔案中使用 retract 指令,以指示其他模組不應使用模組的特定已發布版本。模組作者可以在發現嚴重問題或是不小心發布版本後,收回版本。

go mod vendorgo 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),仍會被視為通過測試。

go test-c-i 旗標與未知旗標併用時會回報錯誤。一般情況下,未知旗標會傳遞給測試,但當使用 -c-i 時,不會執行測試。

go get

go get -insecure 旗標已標示為過時,並將在未來版本中移除。此旗標允許從儲存庫擷取資料,並使用不安全的機制(例如 HTTP)解析自訂網域,還會略過使用檢查總和資料庫進行模組總和驗證。若要允許使用不安全的機制,請改用 GOINSECURE 環境變數。若要略過模組總和驗證,請使用 GOPRIVATEGONOSUMDB。有關詳細資訊,請參閱 go help environment

go get example.com/mod@patch 現要求主模組已需要 example.com/mod 的某個版本。(但 go get -u=patch 會持續套用修補程式,即使是新加入的依賴項。)

GOVCS 環境變數

GOVCS 是新的環境變數,用於限制 go 指令可以使用的哪些版本控制工具來下載原始程式碼。此舉可減輕通常在受信任、經過驗證的環境中使用的工具所發生的安全性問題。預設情況下,githg 可以用於從任何儲存庫下載程式碼。svnbzrfossil 只可以從儲存庫下載程式碼,而其模組路徑或套件路徑符合 GOPRIVATE 環境變數中模式的程式碼。有關詳細資訊,請參閱 go help vcs

all 模式

當主模組的 go.mod 檔案宣告 go 1.16 或更高時,all 套件模式現僅符合由主模組中找到的套件或測試傳遞匯入的那些套件。(不再包含由主模組匯入之套件的 測試 所匯入的套件。)這是自 Go 1.11 以來,go mod vendor 保留的相同套件組。

-toolexec 建置旗標

當指定 -toolexec 建置旗標以在呼叫編譯器或組譯器等工具鏈程式時使用程式時,環境變數 TOOLEXEC_IMPORTPATH 現已設定為正在建置套件的匯入路徑。

-i 建置旗標

go buildgo installgo test 所接受的 -i 旗標現已標示為過時。-i 旗標指示 go 指令安裝由命令列上命名的套件所匯入的套件。自從 Go 1.10 引進建置快取後,-i 旗標不再對建置時間造成重大影響,且當安裝目錄不可寫入時,它會導致錯誤。

list 指令

當指定 -export 標幟時,BuildID 欄位現在會設定成已編譯套件的建置識別碼。這相當於在 go list -exported -f {{.Export}} 上執行 go tool buildid,但不需要執行額外步驟。

-overlay 標幟

-overlay 標幟指定包含一系列檔案路徑替換的 JSON 組態檔案。-overlay 標幟可以與所有建置命令及 go mod 子命令搭配使用。它主要用意是供 gopls 等編輯器工具使用,了解未儲存的原始檔變更造成哪些影響力。組態檔會將實際檔案路徑對應到替換檔案路徑,而 go 命令及其建置會像實際檔案路徑存在並具有替換檔案路徑所提供的內容,或如果替換檔案路徑是空的,則表示不存在一般執行。

Cgo

cgo 工具將不再嘗試將 C 結構 bitfield 轉換成 Go 結構欄位,即使它們的大小可以在 Go 中表示。C bitfield 在記憶體中出現的順序取決於執行,因此在某些情況下,cgo 工具會產生錯誤卻不自知。

Vet

提升 goroutine 無效 testing.T 使用警告

現在 vet 工具會警告在測試中建立的 goroutine 內呼叫測試方法 Fatal 的無效事項。另外也會針對在 testing.T 測試或 testing.B benchmark 上呼叫 FatalfFailNowSkip{,f,Now} 方法發出警告。

呼叫這些方法會停止建立 goroutine 的執行,而不是 Test*Benchmark* 函式。因此,必須由執行測試或 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 顯示測試失敗,並使用替代方法提早離開 goroutine,例如使用 return 語句。先前範例可以重新撰寫為

func TestFoo(t *testing.T) {
    go func() {
        if condition() {
            t.Error("oops")
            return
        }
        ...
    }()
}

提升幀指標警告

現在 vet 工具會針對會覆蓋 BP 暫存器 (幀指標) 卻未儲存和復原的 amd64 彙編發出警告,這有違呼叫慣例。未封裝 BP 暫存器的程式碼必須修改為不使用 BP 或封裝 BP 以儲存和復原。封裝 BP 的一個簡單方法是將幀大小設定為非零值,這會讓產生的序幕和尾聲替您封裝 BP 暫存器。請參閱 CL 248260 作為範例修正。

提升 asn1.Unmarshal 警告

vet 工具現在會警告關於錯誤傳遞非指標或 nil 參數給 asn1.Unmarshal 。這類似現有的 encoding/json.Unmarshalencoding/xml.Unmarshal 檢查。

執行階段

新的 runtime/metrics 套件引入一個穩定的界面,用於讀取來自 Go 執行階段的實作定義量測。它取代了現有的函式,例如 runtime.ReadMemStatsdebug.GCStats,而且顯著地更加通用及有效率。請參閱套件說明文件以取得更多詳情。

設定環境變數 GODEBUGinittrace=1 現在會導致執行階段為每個套件 init 發出單行訊息至標準錯誤,總結它的執行時間和記憶體配置。此追蹤可被用於尋找 Go 啟動效能中的瓶頸或迴歸。 GODEBUG 說明文件 描述了格式。

在 Linux 中,執行階段現在預設立即將記憶體釋放給作業系統(使用 MADV_DONTNEED),而不是在作業系統承受記憶體壓力時才以 Lazy 的方式釋放(使用 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%,平均而言需要減少 5-15% 的記憶體用於 linux/amd64,其他架構和作業系統的進步幅度更大。由於更積極的符號修整,大部分二進位檔案也因此而變得更小。

在 Windows 上,go build -buildmode=c-shared 現在會預設產生 Windows ASLR DLL。可使用 --ldflags=-aslr=false 停用 ASLR。

標準函式庫

內嵌檔案

新的 embed 套件可存取程式中在編譯過程中使用新的 //go:embed 指令內嵌的檔案。

檔案系統

新的 io/fs 套件定義 fs.FS 介面,一個抽象的唯讀檔案系統樹。標準函式庫套件已適時調整,以便使用此介面。

在介面的生產者端,新的 embed.FS 類型採用 fs.FSzip.Reader 也是如此。新的 os.DirFS 函式提供由作業系統檔案樹支援的 fs.FS 實作。

在消費者端,新的 http.FS 函式將 fs.FS 轉換為 http.FileSystem。此外,html/templatetext/template 套件的 ParseFS 函式和方法從 fs.FS 讀取範本。

對於測試實作 fs.FS 的程式碼,新的 testing/fstest 套件提供 TestFS 函式,可檢查和報告常見錯誤。它還提供簡單的記憶體內檔案系統實作 MapFS,對於測試接受 fs.FS 實作的程式碼非常有用。

io/ioutil 的不建議事項

io/ioutil 套件已演變為一個定義不良、難以理解的集合。由該套件提供的全部功能已移至其他套件。io/ioutil 套件仍保留,會繼續比照先前運作,但我們鼓勵新的程式碼使用 ioos 套件中的新定義。這裡是 io/ioutil 匯出的名稱對應到新位置的清單

對函式庫的次要變更

一如往常,函式庫有各式各樣的次要變更和更新,且是以 Go 1 可相容性的承諾為目標。

archive/zip

新的 Reader.Open 方法實作了 fs.FS 介面。

crypto/dsa

crypto/dsa 套件已棄用。請參閱 問題編號 40337

crypto/hmac

如果呼叫雜湊產生函式的個別呼叫未傳回新值,則 New 現在會產生恐慌。前一個行為是未定義的,有時會產生無效的輸出。

crypto/tls

現在可以使用新的 net.ErrClosed 錯誤來偵測正在關閉或已關閉的 TLS 連線上的 I/O 作業。典型的用法會是 errors.Is(err, net.ErrClosed)

現在會在 Conn.Close 中設定預設寫入截止時間,在傳送「close notify」提示之前,以防止無限期地封鎖。

如果伺服器選取了不在 客戶端宣告的清單 內的 ALPN 協定,則現在客戶端會傳回交握錯誤。

如果客戶端或伺服器都沒有 AES 硬體支援,則現在伺服器將偏好使用其他可用的 AEAD 加密組 (例如 ChaCha20Poly1305),並優先於 AES-GCM 加密組,除非同時設定了 Config.PreferServerCipherSuitesConfig.CipherSuites。假設客戶端沒有 AES 硬體支援,如果它沒有表示偏好 AES-GCM 加密組。

Config.Clone 現在會傳回 nil (如果接收端為 nil),而非產生恐慌。

crypto/x509

旗標 GODEBUG=x509ignoreCN=0 將在 Go 1.17 中移除。它啟動舊有行為,將 X.509 憑證上的 CommonName 欄位當成主機名稱,當沒有 Subject Alternative Names 時。

ParseCertificateCreateCertificate 現在對 DNSNamesEmailAddressesURIs 欄位強制執行字串編碼限制。這些欄位只能包含 ASCII 範圍內字元的字串。

CreateCertificate 現在使用簽署者的公開金鑰驗證所產生憑證的簽章。如果簽章無效,則傳回一個錯誤,而非發生變形錯誤的憑證。

DSA 簽章驗證不再受支援。請注意,DSA 簽章的產生從未有支援過。請參閱 問題 #40337

在 Windows 上,Certificate.Verify 現在會傳回平台憑證驗證器建構的所有憑證鏈,而不再只是排名最高的鏈。

新的 SystemRootsError.Unwrap 方法允許透過 errors 套件函式存取 Err 欄位。

在 Unix 系統上,crypto/x509 套件現在在儲存系統憑證池的副本時有了更高的效率。僅使用少數根項目的程式將使用的記憶體減少約半兆位元組。

debug/elf

已經新增更多 DTPT 常數。

encoding/asn1

UnmarshalUnmarshalWithParams 現在當參數不是指標或為空值時,會傳回錯誤而不是發生恐慌。此變更符合其他編碼套件的行為,例如 encoding/json

encoding/json

MarshalUnmarshal 以及相關功能了解的 json 結構標籤欄位現在允許 Go 結構標籤欄位中 JSON 物件名稱內有分號字元。

encoding/xml

編碼器一直非常注意避免使用以下開頭的名稱空間前置詞:xml,因為這是 XML 規格保留的。現在,為了更嚴格遵循規格,這個檢查將不區分大小寫,這表示以下開頭的名稱空間前置詞:XMLXmL 等,也會避免使用。

flag

新的 Func 函數允許註冊透過呼叫函數來執行的旗標,作為實作 Value 介面的更輕量級替代方案。

go/build

Package 結構有新的欄位,會報告套件中關於 //go:embed 指令的資訊:EmbedPatternsEmbedPatternPosTestEmbedPatternsTestEmbedPatternPosXTestEmbedPatternsXTestEmbedPatternPos

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://go.dev.org.tw/design/draft-gobuild。請注意,Go 1.16 支援 //go:build 列,目前不應將其納入 Go 程式中。

html/template

新的 template.ParseFS 函式和 template.Template.ParseFS 方法會像 template.ParseGlobtemplate.Template.ParseGlob 一樣,不過會從 fs.FS 讀取範本。

io

此套件現在定義了 ReadSeekCloser 介面。

此套件現在定義了 DiscardNopCloserReadAll,取代 io/ioutil 套件中具有相同名稱的物件。

log

新的 Default 函式提供對預設 Logger 的存取。

log/syslog

現在,當記錄到自訂 Unix 網域 socket 時,Writer 會使用本機訊息格式(略過主機名稱並使用較短的時間戳記),以符合已用於預設記錄 socket 的格式。

mime/multipart

當傳遞最大 int64 值作為限制時,ReaderReadForm 方法不再會拒絕表單資料。

net

現在可以用新的 ErrClosed 錯誤偵測封閉網路連線上的 I/O 情況,或偵測在任何 I/O 完成前就被封閉的網路連線上的 I/O 情況。一般用法為 errors.Is(err, net.ErrClosed)。在早期版本中,可靠偵測此情況的唯一方式是將 Error 方法傳回的字串與 "use of closed network connection" 相符。

在以前的 Go 版本中,Linux 系統上由 /proc/sys/net/core/somaxconn 設定的 TCP 偵聽器預設佇列大小限制在最大 65535。在 Linux kernel 版本 4.1 及以上版本中,此最大值現在是 4294967295

在 Linux 系統上,現在在找不到 /etc/nsswitch.conf 時,主機名稱查詢不再在檢查 /etc/hosts 之前使用 DNS;這是基於 musl 的系統上的常見行為,而且會讓 Go 程式的行為與那些系統上的 C 程式相同。

net/http

net/http 套件中,StripPrefix 的行為已更改,除了 Path 欄位之外,還會從請求 URL 的 RawPath 欄位中去除字首。在過去的版本中,只有 Path 欄位會經過修剪,因此若請求 URL 含有任何跳脫字元,URL 會被修改成不匹配 PathRawPath 欄位。在 Go 1.16 中,StripPrefix 會修剪兩個欄位。如果請求 URL 的前綴部分含有跳脫字元,則處理常式會提供一個 404 錯誤,而不是像之前一樣呼叫具有不匹配 Path/RawPath 對應的底層處理常式。

net/http 套件現在拒絕下列形式的 HTTP 範圍請求:"Range": "bytes=--N"(其中 "-N" 為負後綴長度),例如 "Range": "bytes=--2"。它現在會回應 416 "Range Not Satisfiable" 訊息。

使用 SameSiteDefaultMode 設定的 Cookie 現在根據目前的規範 (沒有設定屬性) 進行處理,而不是產生沒有值的 SameSite 鍵。

Client 現在會在具有空內容的 PATCH 請求中傳送一個明確的 Content-Length: 0 標頭,與現有的 POSTPUT 行為相符。

當未設定 HTTPS_PROXY 時,ProxyFromEnvironment 函數不再回傳 ` HTTP_PROXY` 環境變數對於 ` https://` URL 的設定。

Transport 型別有一個新的欄位 GetProxyConnectHeader,可以設定為在 CONNECT 請求期間傳送至代理伺服器的標頭。實際上,GetProxyConnectHeader 是現有欄位 ProxyConnectHeader 的動態版本;如果 GetProxyConnectHeader 不是 nil,則會忽略 ProxyConnectHeader

新的 http.FS 函數會將 fs.FS 轉換為 http.FileSystem

net/http/httputil

ReverseProxy 現在在代理具有未知內容長度的串流回應時更積極地沖刷緩衝資料。

net/smtp

ClientMail 方法現在會將 SMTPUTF8 指令傳送給支援的伺服器,表示位址是用 UTF-8 編碼。

os

Process.Signal 現在會在處理程序已經完成時,回傳 ErrProcessDone,而不是未匯出的 errFinished

這個套件定義了一個新類型 DirEntry 作為 fs.DirEntry 的別名,新的 ReadDir 函式和新的 File.ReadDir 方法可以被用來將目錄內容讀進 DirEntry 的序列中。 File.Readdir 方法(注意 dir 中的小寫 d )現在仍然存在,會回傳一個 FileInfo 序列,但對大多數程式來說,轉用 File.ReadDir 會更有效率。

現在,這個套件定義了 CreateTempMkdirTempReadFileWriteFile,可被用來取代在 io/ioutil 套件中定義的函式。

現在,資料類型 FileInfoFileModePathErrorio/fs 中同名資料類型的別名。已更新 os 套件中的函式簽名,來引用 io/fs 套件中的名稱。這不應影響任何現有的程式碼。

新的 DirFS 函式提供了一個 fs.FS 的實作,由作業系統檔案的樹狀結構作為支撐。

os/signal

新的 NotifyContext 函式允許建立可以在特定的訊號送達時取消的背景。

路徑

現在,如果模式未匹配的部分具有語法錯誤,Match 函式會回傳一個錯誤。以前,當匹配失敗時,此函式會提早回傳,因此不會報告模式中任何後面的語法錯誤。

路徑/檔案路徑

新的 WalkDir 函式類似於 Walk,不過通常更為有效率,傳遞給 WalkDir 的函式接收一個 fs.DirEntry 而不是一個 fs.FileInfo。(對那些記得 Walk 函式會接收 os.FileInfo 的人說明一下,os.FileInfo 現在是 fs.FileInfo 的別名。)

現在,如果模式未匹配的部分具有語法錯誤,MatchGlob 函式會回傳一個錯誤。以前,當匹配失敗時,這兩個函式會提早回傳,因此不會報告模式中任何後面的語法錯誤。

反射

Zero 函式已最佳化,以避免配置。錯誤地使用 == 或 DeepEqual 將傳回的 Value 與另一個 Value 做比較時,可能會得到與之前 Go 版本中不同的結果。reflect.Value 說明文件中說明如何正確地比較兩個 Value

runtime/debug

當啟用 SetPanicOnFault 時所使用的 runtime.Error 值現在可能有一個 Addr 方法。如果該方法存在,其會傳回觸發該錯誤的記憶體位置。

strconv

ParseFloat 現在使用 Eisel-Lemire 演算法,使其效能提升至多 2 倍。它也可以加速對 encoding/json 等文字格式進行解碼。

syscall

NewCallbackNewCallbackCDecl 現在正確支援在同一列中含有許多個小於 uintptr 大小的引數的回呼函式。這樣可能就必須變更對這些函式的使用,才能在小型引數間消除手動內嵌的區塊。

在 Windows 上,SysProcAttr 有新的 NoInheritHandles 欄位,可禁用在建立新的流程時繼承處理常式。

在 Windows 上,DLLError 現在有一個 Unwrap 方法,可解開其底層的錯誤。

在 Linux 上,現在已經實作了 SetgidSetuid 以及相關呼叫。先前,這些會傳回 syscall.EOPNOTSUPP 錯誤。

在 Linux 上,新的函式 AllThreadsSyscallAllThreadsSyscall6 可用來在流程中的所有 Go 執行緒上執行系統呼叫。這些函式只能由不使用 cgo 的程式使用;如果程式使用了 cgo,這些函式將永遠傳回 syscall.ENOTSUP

testing/iotest

新的 ErrReader 函式傳回一個 io.Reader,然後永遠傳回錯誤。

新的 TestReader 函式會測試一個 io.Reader 是否正確運作。

text/template

現在允許在動作分隔符號中放置換行字元,這樣就能讓動作跨越多行。

新的 template.ParseFS 函式和 template.Template.ParseFS 方法就像 template.ParseGlobtemplate.Template.ParseGlob,但從 fs.FS 讀取範本。

text/template/parse

在分析樹中新增一個新的 CommentNodeparse.Tree 中的 Mode 欄位已啟用存取它的功能。

時間/時區資料

縮減的時區資料格式現在用於 $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) 指定為第三輔助漢字平面。