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 模擬器。先前透過設定 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/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
旗標將會永遠啟用。
現在可以在 go.mod
檔案中使用 retract
指令,以指示其他模組不應使用模組的特定已發布版本。模組作者可以在發現嚴重問題或是不小心發布版本後,收回版本。
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)
,仍會被視為通過測試。
go
test
在 -c
或 -i
旗標與未知旗標併用時會回報錯誤。一般情況下,未知旗標會傳遞給測試,但當使用 -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
建置旗標以在呼叫編譯器或組譯器等工具鏈程式時使用程式時,環境變數 TOOLEXEC_IMPORTPATH
現已設定為正在建置套件的匯入路徑。
-i
建置旗標
go
build
、go
install
和 go
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 上呼叫 Fatalf
、FailNow
和 Skip{,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.Unmarshal
和 encoding/xml.Unmarshal
檢查。
執行階段
新的 runtime/metrics
套件引入一個穩定的界面,用於讀取來自 Go 執行階段的實作定義量測。它取代了現有的函式,例如 runtime.ReadMemStats
和 debug.GCStats
,而且顯著地更加通用及有效率。請參閱套件說明文件以取得更多詳情。
設定環境變數 GODEBUG
為 inittrace=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.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.Discard
NopCloser
=>io.NopCloser
ReadAll
=>io.ReadAll
ReadDir
=>os.ReadDir
(注意:會傳回os.DirEntry
清單,而非fs.FileInfo
清單)ReadFile
=>os.ReadFile
TempDir
=>os.MkdirTemp
TempFile
=>os.CreateTemp
WriteFile
=>os.WriteFile
對函式庫的次要變更
一如往常,函式庫有各式各樣的次要變更和更新,且是以 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.PreferServerCipherSuites
和 Config.CipherSuites
。假設客戶端沒有 AES 硬體支援,如果它沒有表示偏好 AES-GCM 加密組。
Config.Clone
現在會傳回 nil (如果接收端為 nil),而非產生恐慌。
crypto/x509
旗標 GODEBUG=x509ignoreCN=0
將在 Go 1.17 中移除。它啟動舊有行為,將 X.509 憑證上的 CommonName
欄位當成主機名稱,當沒有 Subject Alternative Names 時。
ParseCertificate
和 CreateCertificate
現在對 DNSNames
、EmailAddresses
和 URIs
欄位強制執行字串編碼限制。這些欄位只能包含 ASCII 範圍內字元的字串。
CreateCertificate
現在使用簽署者的公開金鑰驗證所產生憑證的簽章。如果簽章無效,則傳回一個錯誤,而非發生變形錯誤的憑證。
DSA 簽章驗證不再受支援。請注意,DSA 簽章的產生從未有支援過。請參閱 問題 #40337。
在 Windows 上,Certificate.Verify
現在會傳回平台憑證驗證器建構的所有憑證鏈,而不再只是排名最高的鏈。
新的 SystemRootsError.Unwrap
方法允許透過 errors
套件函式存取 Err
欄位。
在 Unix 系統上,crypto/x509
套件現在在儲存系統憑證池的副本時有了更高的效率。僅使用少數根項目的程式將使用的記憶體減少約半兆位元組。
debug/elf
encoding/asn1
Unmarshal
和 UnmarshalWithParams
現在當參數不是指標或為空值時,會傳回錯誤而不是發生恐慌。此變更符合其他編碼套件的行為,例如 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://go.dev.org.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 網域 socket 時,Writer
會使用本機訊息格式(略過主機名稱並使用較短的時間戳記),以符合已用於預設記錄 socket 的格式。
mime/multipart
當傳遞最大 int64 值作為限制時,Reader
的 ReadForm
方法不再會拒絕表單資料。
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 會被修改成不匹配 Path
和 RawPath
欄位。在 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
標頭,與現有的 POST
和 PUT
行為相符。
當未設定 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
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
函式允許建立可以在特定的訊號送達時取消的背景。
路徑
現在,如果模式未匹配的部分具有語法錯誤,Match
函式會回傳一個錯誤。以前,當匹配失敗時,此函式會提早回傳,因此不會報告模式中任何後面的語法錯誤。
路徑/檔案路徑
新的 WalkDir
函式類似於 Walk
,不過通常更為有效率,傳遞給 WalkDir
的函式接收一個 fs.DirEntry
而不是一個 fs.FileInfo
。(對那些記得 Walk
函式會接收 os.FileInfo
的人說明一下,os.FileInfo
現在是 fs.FileInfo
的別名。)
現在,如果模式未匹配的部分具有語法錯誤,Match
和 Glob
函式會回傳一個錯誤。以前,當匹配失敗時,這兩個函式會提早回傳,因此不會報告模式中任何後面的語法錯誤。
反射
Zero 函式已最佳化,以避免配置。錯誤地使用 == 或 DeepEqual 將傳回的 Value 與另一個 Value 做比較時,可能會得到與之前 Go 版本中不同的結果。reflect.Value
說明文件中說明如何正確地比較兩個 Value
。
runtime/debug
當啟用 SetPanicOnFault
時所使用的 runtime.Error
值現在可能有一個 Addr
方法。如果該方法存在,其會傳回觸發該錯誤的記憶體位置。
strconv
ParseFloat
現在使用 Eisel-Lemire 演算法,使其效能提升至多 2 倍。它也可以加速對 encoding/json
等文字格式進行解碼。
syscall
NewCallback
和 NewCallbackCDecl
現在正確支援在同一列中含有許多個小於 uintptr
大小的引數的回呼函式。這樣可能就必須變更對這些函式的使用,才能在小型引數間消除手動內嵌的區塊。
在 Windows 上,SysProcAttr
有新的 NoInheritHandles
欄位,可禁用在建立新的流程時繼承處理常式。
在 Windows 上,DLLError
現在有一個 Unwrap
方法,可解開其底層的錯誤。
在 Linux 上,現在已經實作了 Setgid
、Setuid
以及相關呼叫。先前,這些會傳回 syscall.EOPNOTSUPP
錯誤。
在 Linux 上,新的函式 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
欄位已啟用存取它的功能。
時間/時區資料
縮減的時區資料格式現在用於 $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) 指定為第三輔助漢字平面。