Go 1.24 發行說明

Go 1.24 簡介

最新發布的 Go 版本 1.24 將於 2025 年 2 月 釋出,比 Go 1.23 晚六個月。其大部分改動集中在工具鏈、執行時和庫的實現上。一如既往,本次釋出也遵循 Go 1 相容性承諾。我們預計絕大多數 Go 程式都能像以前一樣繼續編譯和執行。

語言變化

Go 1.24 現在完全支援 泛型類型別名:類型別名可以像定義型別一樣進行引數化。詳情請參閱 語言規範。目前,可以透過設定 GOEXPERIMENT=noaliastypeparams 來停用此功能;但 aliastypeparams 設定將在 Go 1.25 中移除。

工具

Go 命令

Go 模組現在可以使用 go.mod 中的 tool 指令來跟蹤可執行依賴項。這消除了之前透過將工具作為空白匯入新增到命名為“tools.go”的檔案的變通方法。go tool 命令現在可以執行這些工具,以及 Go 發行版自帶的工具。更多資訊請參閱 文件

go get 命令的新 -tool 標誌會在為命名包新增 require 指令的同時,為當前模組新增 tool 指令。

新的 tool 元模式 指的是當前模組中的所有工具。可以使用 go get tool 來升級它們,或使用 go install tool 將它們安裝到 GOBIN 目錄。

go run 命令和新的 go tool 行為現在會將可執行檔案快取在 Go 構建快取中。這使得重複執行速度更快,但會增加快取的大小。請參閱 #69290

go buildgo install 命令現在接受 -json 標誌,該標誌會將構建輸出和失敗資訊以結構化的 JSON 格式報告到標準輸出。有關報告格式的詳細資訊,請參閱 go help buildjson

此外,go test -json 現在會以 JSON 格式報告構建輸出和失敗資訊,並與測試結果 JSON 交錯。這些可以透過新的 Action 型別區分,但如果這在測試整合系統中引起問題,您可以使用 GODEBUG 設定 gotestjsonbuildtext=1 恢復到文字構建輸出。

新的 GOAUTH 環境變數提供了一種靈活的方式來認證私有模組的獲取。有關更多資訊,請參閱 go help goauth

go build 命令現在會在編譯後的二進位制檔案中設定 主模組版本,該版本基於版本控制系統的標籤和/或提交。如果存在未提交的更改,則會附加 +dirty 字尾。使用 -buildvcs=false 標誌可以從二進位制檔案中省略版本控制資訊。

新的 GODEBUG 設定 toolchaintrace=1 可用於跟蹤 go 命令的工具鏈選擇過程。

Cgo

Cgo 支援用於 C 函式的新註解,以提高執行時效能。#cgo noescape cFunctionName 告訴編譯器傳遞給 C 函式 cFunctionname 的記憶體不會逃逸。#cgo nocallback cFunctionName 告訴編譯器 C 函式 cFunctionName 不會回撥到任何 Go 函式。有關更多資訊,請參閱 cgo 文件

Cgo 目前拒絕編譯對具有多個不相容宣告的 C 函式的呼叫。例如,如果 f 被宣告為 void f(int)void f(double),cgo 將報告一個錯誤,而不是可能為 f(0) 生成不正確的呼叫序列。此版本的新增功能是,當不相容的宣告出現在不同的檔案中時,能夠更好地檢測到此錯誤情況。請參閱 #67699

Objdump

objdump 工具現在支援 64 位 LoongArch (GOARCH=loong64)、RISC-V (GOARCH=riscv64) 和 S390X (GOARCH=s390x) 的反彙編。

Vet

新的 tests 分析器報告測試包中宣告的測試、fuzzers、基準和示例的常見錯誤,例如名稱格式錯誤、簽名不正確或文件中不存在識別符號的示例。其中一些錯誤可能導致測試無法執行。此分析器屬於 go test 執行的分析器子集。

現有的 printf 分析器現在會報告對 fmt.Printf(s) 形式呼叫的診斷,其中 s 是一個非常量格式字串,沒有其他引數。此類呼叫幾乎總是錯誤,因為 s 的值可能包含 % 符號;請改用 fmt.Print。請參閱 #60529。此檢查傾向於在現有程式碼中產生髮現,因此僅在語言版本(由 go.mod go 指令或 //go:build 註釋指定)至少為 Go 1.24 時才應用,以避免在更新到 1.24 Go 工具鏈時導致持續整合失敗。

現有的 buildtag 分析器現在會在 //go:build 指令中存在無效的 Go 主要版本構建約束時報告診斷。例如,//go:build go1.23.1 指的是一個點發布;請改用 //go:build go1.23。請參閱 #64127

現有的 copylock 分析器現在會在 3 節“for”迴圈(例如 for i := iter(); done(i); i = next(i) { ... })中宣告的變數包含 sync.Locker(如 sync.Mutex)時報告診斷。Go 1.22 更改了這些迴圈的行為,為每次迭代建立一個新變數,並從前一次迭代複製值;此複製操作對鎖不安全。請參閱 #66387

GOCACHEPROG

cmd/go 內部二進位制檔案和測試快取機制現在可以透過實現 cmd/go 工具和 GOCACHEPROG 環境變數指定的子程序之間的 JSON 協議的子程序來實現。這以前是隱藏在 GOEXPERIMENT 後面。有關協議詳細資訊,請參閱 文件

執行時

執行時的一些效能改進,在代表性基準測試套件的平均 CPU 開銷降低了 2-3%。結果可能因應用程式而異。這些改進包括基於 Swiss Tables 的新內建 map 實現、對小物件的更高效記憶體分配以及新的執行時內部互斥鎖實現。

新的內建 map 實現和新的執行時內部互斥鎖可以透過在構建時分別設定 GOEXPERIMENT=noswissmapGOEXPERIMENT=nospinbitmutex 來停用。

編譯器

編譯器已經不允許為 cgo 生成的接收者型別定義新方法,但可以透過別名型別規避該限制。Go 1.24 現在始終報告錯誤,如果接收者直接或間接(透過別名型別)表示 cgo 生成的型別。

連結器

在預設情況下,連結器現在會在 ELF 平臺上生成 GNU 構建 ID(ELF NT_GNU_BUILD_ID 註釋),在 macOS 上生成 UUID(Mach-O LC_UUID 載入命令)。構建 ID 或 UUID 源自 Go 構建 ID。可以透過 -B none 連結器標誌停用它,或透過 -B 0xNNNN 連結器標誌以及使用者指定的十六進位制值來覆蓋它。

引導

正如 Go 1.22 發行說明中所述,Go 1.24 現在需要 Go 1.22.6 或更高版本才能引導。我們預計 Go 1.26 將需要 Go 1.24 的點發布或更高版本才能引導。

標準庫

目錄限制的檔案系統訪問

新的 os.Root 型別提供了在特定目錄內執行檔案系統操作的能力。

os.OpenRoot 函式開啟一個目錄並返回一個 os.Rootos.Root 上的方法在目錄內操作,並且不允許使用指向目錄外部位置的路徑,包括那些跟隨符號連結出目錄的路徑。os.Root 上的方法映象了 os 包中幾乎所有可用的檔案系統操作,例如 os.Root.Openos.Root.Createos.Root.Mkdiros.Root.Stat

新的基準測試函式

基準測試現在可以使用更快、更不易出錯的 testing.B.Loop 方法來執行基準測試迭代,例如 for b.Loop() { ... },而不是涉及 b.N 的典型迴圈結構,如 for range b.N。這提供了兩個顯著的優勢:

  • 基準測試函式將在每個 -count 執行一次,因此昂貴的設定和清理步驟僅執行一次。
  • 函式呼叫引數和結果會保持存活,防止編譯器完全最佳化掉迴圈體。

改進的 finalizers

新的 runtime.AddCleanup 函式是一種 finalization 機制,它比 runtime.SetFinalizer 更靈活、更高效、更不易出錯。AddCleanup 將一個清理函式附加到一個物件上,該函式將在物件不再可達時執行。但是,與 SetFinalizer 不同的是,可以將多個清理函式附加到同一個物件上,可以將清理函式附加到內部指標上,清理函式通常不會在物件形成迴圈時導致記憶體洩漏,並且清理函式不會延遲物件或其指向的物件被釋放。新程式碼應優先使用 AddCleanup 而不是 SetFinalizer

新的 weak 包

新的 weak 包提供了弱指標。

弱指標是一種低階原語,用於建立記憶體高效的資料結構,例如用於關聯值的弱對映、用於任何未被 unique 包覆蓋的規範化對映以及各種快取。為了支援這些用例,此版本還提供了 runtime.AddCleanupmaphash.Comparable

新 crypto/mlkem 包

新的 crypto/mlkem 包實現了 ML-KEM-768 和 ML-KEM-1024。

ML-KEM 是一種後量子金鑰交換機制,以前稱為 Kyber,並在 FIPS 203 中進行了規定。

新 crypto/hkdf、crypto/pbkdf2 和 crypto/sha3 包

新的 crypto/hkdf 包實現了 HMAC 提取和擴充套件金鑰派生函式 HKDF,如 RFC 5869 所定義。

新的 crypto/pbkdf2 包實現了基於密碼的金鑰派生函式 PBKDF2,如 RFC 8018 所定義。

新的 crypto/sha3 包實現了 SHA-3 雜湊函式以及 SHAKE 和 cSHAKE 可擴充套件輸出函式,如 FIPS 202 所定義。

這三個包都基於預先存在的 golang.org/x/crypto/... 包。

FIPS 140-3 合規性

此版本包含 一套新的機制,以促進 FIPS 140-3 合規性

Go Cryptographic Module 是一組內部標準庫包,用於透明地實現 FIPS 140-3 批准的演算法。應用程式無需更改即可使用 Go Cryptographic Module 來實現批准的演算法。

新的 GOFIPS140 環境變數可用於在構建中選擇要使用的 Go Cryptographic Module 版本。新的 fips140 GODEBUG 設定可用於在執行時啟用 FIPS 140-3 模式。

Go 1.24 包含 Go Cryptographic Module 版本 v1.0.0,目前正在與 CMVP 認可的實驗室進行測試。

新的實驗性 testing/synctest 包

新的實驗性 testing/synctest 包提供了對併發程式碼測試的支援。

  • synctest.Run 函式在一個隔離的“氣泡”中啟動一組 goroutine。在氣泡中,time 包函式操作於一個偽造的時鐘。
  • synctest.Wait 函式等待當前氣泡中的所有 goroutine 阻塞。

有關更多詳細資訊,請參閱包文件。

synctest 包是實驗性的,必須透過在構建時設定 GOEXPERIMENT=synctest 來啟用。包 API 在未來的版本中可能會發生變化。有關更多資訊和提供反饋,請參閱 issue #67434

對庫的微小更改

archive

archive/ziparchive/tar 中的 (*Writer).AddFS 實現現在為已空目錄寫入目錄頭。

bytes

bytes 包添加了幾個處理迭代器的函式。

  • Lines 返回一個位元組切片中以換行符結尾的行的迭代器。
  • SplitSeq 返回一個按分隔符分割的位元組切片子切片迭代器。
  • SplitAfterSeq 返回一個在每次出現分隔符後分割的位元組切片子切片迭代器。
  • FieldsSeq 返回一個根據 unicode.IsSpace 定義的,按空白字元執行分割的位元組切片子切片迭代器。
  • FieldsFuncSeq 返回一個按滿足謂詞的 Unicode 程式碼點執行分割的位元組切片子切片迭代器。

crypto/aes

NewCipher 返回的值不再實現 NewCTRNewGCMNewCBCEncrypterNewCBCDecrypter 方法。這些方法是未文件化的,並且並非在所有架構上都可用。相反,應該將 Block 值直接傳遞給相關的 crypto/cipher 函式。目前,crypto/cipher 仍然會檢查 Block 值上的這些方法,即使它們不再被標準庫使用。

crypto/cipher

新的 NewGCMWithRandomNonce 函式返回一個實現 AES-GCM 的 AEAD,它會在 Seal 時生成一個隨機 nonce 並將其前置到密文中。

當與 crypto/aes 一起使用時,NewCTR 返回的 Stream 實現現在在 amd64 和 arm64 上速度提高了數倍。

NewOFBNewCFBEncrypterNewCFBDecrypter 現在已棄用。OFB 和 CFB 模式不進行身份驗證,這通常允許主動攻擊來操縱和恢復明文。建議應用程式改用 AEAD 模式。如果需要未經驗證的 Stream 模式,請改用 NewCTR

crypto/ecdsa

PrivateKey.Sign 現在根據 RFC 6979 生成確定性簽名(如果隨機源為 nil)。

crypto/md5

md5.New 返回的值現在也實現了 encoding.BinaryAppender 介面。

crypto/rand

Read 函式現在保證不會失敗。它將始終返回 nil 作為 error 結果。如果 Read 在從 Reader 讀取時遇到錯誤,程式將不可挽回地崩潰。請注意,預設 Reader 使用的平臺 API 文件表明總是成功,因此此更改只會影響重寫 Reader 變數的程式。一個例外是 3.17 版本之前的 Linux 核心,其中預設 Reader 仍然開啟 /dev/urandom 並且可能會失敗。

在 Linux 6.11 及更高版本上,Reader 現在透過 vDSO 使用 getrandom 系統呼叫。這速度更快,特別是對於小讀取。

在 OpenBSD 上,Reader 現在使用 arc4random_buf(3)

新的 Text 函式可用於生成加密安全的隨機文字字串。

crypto/rsa

GenerateKey 現在會在請求小於 1024 位的金鑰時返回錯誤。所有 Sign、Verify、Encrypt 和 Decrypt 方法現在在與小於 1024 位的金鑰一起使用時返回錯誤。此類金鑰不安全,不應使用。使用 GODEBUG 設定 rsa1024min=0 可以恢復舊行為,但我們建議僅在必要時且僅在測試中使用,例如透過將 //go:debug rsa1024min=0 行新增到測試檔案中。新的 GenerateKey 示例 提供了一個易於使用的標準 2048 位測試金鑰。

現在可以在 PrivateKey.Validate 之前安全且更高效地呼叫 PrivateKey.Precompute。在存在部分填充的 PrecomputedValues 的情況下,Precompute 現在速度更快,例如在從 JSON unmarshal 金鑰時。

該包現在拒絕更多無效金鑰,即使沒有呼叫 Validate,並且 GenerateKey 可能會因損壞的隨機源而返回新錯誤。PrivateKeyPrimesPrecomputed 欄位現在使用並驗證,即使某些值丟失。另請參閱下面 描述的 crypto/x509 解析和 marshaling RSA 金鑰的變化

SignPKCS1v15VerifyPKCS1v15 現在支援 SHA-512/224、SHA-512/256 和 SHA-3。

GenerateKey 現在使用略有不同的方法來生成私有指數(Carmichael 的尤拉函式而不是尤拉的尤拉函式)。極少數從僅素數因子外部重新生成金鑰的應用程式可能會產生不同但相容的結果。

在 wasm 上,公鑰和私鑰操作現在速度提高了一倍。

crypto/sha1

sha1.New 返回的值現在也實現了 encoding.BinaryAppender 介面。

crypto/sha256

sha256.Newsha256.New224 返回的值現在也實現了 encoding.BinaryAppender 介面。

crypto/sha512

sha512.Newsha512.New384sha512.New512_224sha512.New512_256 返回的值現在也實現了 encoding.BinaryAppender 介面。

crypto/subtle

新的 WithDataIndependentTiming 函式允許使用者執行一個函式,其中啟用特定於體系結構的特性,這些特性保證特定的指令是資料值時間不變的。這可以用來確保設計為在恆定時間內執行的程式碼不會被 CPU 級特性最佳化為在可變時間內執行。目前,WithDataIndependentTiming 使用 arm64 上的 PSTATE.DIT 位,在所有其他體系結構上則不起作用。GODEBUG 設定 dataindependenttiming=1 會為整個 Go 程式啟用 DIT 模式。

XORBytes 的輸出必須完全重疊或完全不重疊。以前,行為是未定義的,而現在 XORBytes 會 panic。

crypto/tls

TLS 伺服器現在支援加密客戶端問候 (ECH)。可以透過填充 Config.EncryptedClientHelloKeys 欄位來啟用此功能。

新的後量子 X25519MLKEM768 金鑰交換機制現在受支援,並且在 Config.CurvePreferences 為 nil 時預設啟用。GODEBUG 設定 tlsmlkem=0 會恢復預設值。當處理有 bug 的 TLS 伺服器(它們無法正確處理大記錄,導致握手超時)時,這可能很有用(參見 TLS post-quantum TL;DR fail)。

已移除對實驗性 X25519Kyber768Draft00 金鑰交換的支援。

金鑰交換順序現在完全由 crypto/tls 包處理。Config.CurvePreferences 的順序現在被忽略,並且當欄位被填充時,其內容僅用於確定啟用哪些金鑰交換。

新的 ClientHelloInfo.Extensions 欄位列出了在 Client Hello 訊息中收到的擴充套件 ID。這對於 TLS 客戶端指紋識別很有用。

crypto/x509

x509sha1 GODEBUG 設定已被移除。Certificate.Verify 不再支援 SHA-1 簽名。

OID 現在實現了 encoding.BinaryAppenderencoding.TextAppender 介面。

預設證書策略欄位已從 Certificate.PolicyIdentifiers 更改為 Certificate.Policies。解析證書時,兩個欄位都將被填充,但在建立證書時,策略將從 Certificate.Policies 欄位而不是 Certificate.PolicyIdentifiers 欄位中獲取。此更改可以透過 GODEBUG 設定 x509usepolicies=0 來恢復。

當傳遞一個帶有 nil Certificate.SerialNumber 欄位的模板時,CreateCertificate 現在將使用符合 RFC 5280 的方法生成序列號,而不是失敗。

Certificate.Verify 現在支援策略驗證,如 RFC 5280 和 RFC 9618 所定義。新的 VerifyOptions.CertificatePolicies 欄位可以設定為一組可接受的策略 OIDs。只有具有有效策略圖的證書鏈才會從 Certificate.Verify 返回。

MarshalPKCS8PrivateKey 現在返回一個錯誤,而不是 marshaling 一個無效的 RSA 金鑰。(MarshalPKCS1PrivateKey 沒有錯誤返回,並且在提供無效金鑰時的行為仍然是未定義的。)

ParsePKCS1PrivateKeyParsePKCS8PrivateKey 現在使用並驗證編碼的 CRT 值,因此可能會拒絕以前接受的無效 RSA 金鑰。使用 GODEBUG 設定 x509rsacrt=0 來恢復重新計算 CRT 值。

debug/elf

debug/elf 包增加了對處理動態 ELF(可執行和可連結格式)檔案中的符號版本支援。新的 File.DynamicVersions 方法返回 ELF 檔案中定義的動態版本列表。新的 File.DynamicVersionNeeds 方法返回此 ELF 檔案在其他 ELF 物件中定義的動態版本列表。最後,新的 Symbol.HasVersionSymbol.VersionIndex 欄位指示符號的版本。

encoding

引入了兩個新介面:TextAppenderBinaryAppender,用於將物件的文字或二進位制表示附加到位元組切片。這些介面提供了與 TextMarshalerBinaryMarshaler 相同的功能,但它們不是每次都分配新切片,而是將資料直接附加到現有切片。這些介面現在由已經實現了 TextMarshaler 和/或 BinaryMarshaler 的標準庫型別實現。

encoding/json

在 marshaling 時,如果 struct 欄位的 omitzero 選項(在 struct 欄位標籤中)的值為零,則該欄位將被省略。如果欄位型別具有 IsZero() bool 方法,則使用該方法來確定值是否為零。否則,當值為 其型別的零值時,該值為零。omitzero 欄位標籤比 omitempty 更清晰且不易出錯,當意圖是省略零值時。特別是,與 omitempty 不同,omitzero 會省略零值的 time.Time 值,這是一個常見的摩擦點。

如果同時指定了 omitemptyomitzero,則當值為空或為零(或兩者)時,該欄位將被省略。

UnmarshalTypeError.Field 現在包含嵌入式 struct,以提供更詳細的錯誤訊息。

go/types

所有暴露使用 Len() intAt(int) T 對方法序列的 go/types 資料結構現在也都具有返回迭代器的方法,這允許您簡化如下程式碼:

params := fn.Type.(*types.Signature).Params()
for i := 0; i < params.Len(); i++ {
   use(params.At(i))
}

到如下程式碼:

for param := range fn.Signature().Params().Variables() {
   use(param)
}

這些方法是:Interface.EmbeddedTypesInterface.ExplicitMethodsInterface.MethodsMethodSet.MethodsNamed.MethodsScope.ChildrenStruct.FieldsTuple.VariablesTypeList.TypesTypeParamList.TypeParamsUnion.Terms

hash/adler32

New 返回的值現在也實現了 encoding.BinaryAppender 介面。

hash/crc32

NewNewIEEE 返回的值現在也實現了 encoding.BinaryAppender 介面。

hash/crc64

New 返回的值現在也實現了 encoding.BinaryAppender 介面。

hash/fnv

New32New32aNew64New64aNew128New128a 返回的值現在也實現了 encoding.BinaryAppender 介面。

hash/maphash

新的 ComparableWriteComparable 函式可以計算任何可比較值的雜湊值。這使得可以雜湊任何可以用作 Go map 鍵的值。

日誌/slog

新的 DiscardHandler 是一個永遠不會被啟用且始終丟棄其輸出的 handler。

LevelLevelVar 現在實現了 encoding.TextAppender 介面。

math/big

FloatIntRat 現在實現了 encoding.TextAppender 介面。

math/rand

呼叫已棄用的頂級 Seed 函式不再生效。要恢復舊行為,請使用 GODEBUG 設定 randseednop=0。有關更多背景資訊,請參閱 proposal #67273

math/rand/v2

ChaCha8PCG 現在實現了 encoding.BinaryAppender 介面。

net

ListenConfig 在支援 MPTCP 的系統上(目前僅限 Linux)預設使用 MPTCP。

IP 現在實現了 encoding.TextAppender 介面。

net/http

Transport 對收到 1xx 資訊性響應的限制已更改。之前,它會在收到超過 5 個 1xx 響應後中止請求並返回錯誤。現在,如果所有 1xx 響應的總大小超過 Transport.MaxResponseHeaderBytes 配置設定,它將返回錯誤。

此外,當請求具有 net/http/httptrace.ClientTrace.Got1xxResponse trace hook 時,1xx 響應的總數不再有限制。Got1xxResponse hook 可以返回一個錯誤來中止請求。

TransportServer 現在有一個 HTTP2 欄位,允許配置 HTTP/2 協議設定。

新的 Server.ProtocolsTransport.Protocols 欄位提供了一種簡單的方法來配置伺服器或客戶端使用的 HTTP 協議。

伺服器和客戶端可以配置為支援未加密的 HTTP/2 連線。

Server.Protocols 包含 UnencryptedHTTP2 時,伺服器將在未加密的埠上接受 HTTP/2 連線。伺服器可以在同一個埠上接受 HTTP/1 和未加密的 HTTP/2。

Transport.Protocols 包含 UnencryptedHTTP2 且不包含 HTTP1 時,傳輸將對 http:// URL 使用未加密的 HTTP/2。如果傳輸配置為同時使用 HTTP/1 和未加密的 HTTP/2,它將使用 HTTP/1。

未加密的 HTTP/2 支援使用“帶優先知識的 HTTP/2”(RFC 9113,第 3.3 節)。已棄用的“Upgrade: h2c”頭不受支援。

net/netip

AddrAddrPortPrefix 現在實現了 encoding.BinaryAppenderencoding.TextAppender 介面。

net/url

URL 現在也實現了 encoding.BinaryAppender 介面。

os/user

在 Windows 上,Current 現在可以在 Windows Nano Server 中使用。實現已更新,避免使用 NetApi32 庫中的函式,該庫在 Nano Server 中不可用。

在 Windows 上,CurrentLookupLookupId 現在支援以下內建服務使用者帳戶:

  • NT AUTHORITY\SYSTEM
  • NT AUTHORITY\LOCAL SERVICE
  • NT AUTHORITY\NETWORK SERVICE

在 Windows 上,噹噹前使用者加入一個慢速域時(這對於許多企業使用者來說是常見情況),Current 的速度顯著加快。新實現的效能現在是毫秒級的,而之前的實現可能需要幾秒鐘甚至幾分鐘才能完成。

在 Windows 上,噹噹前執行緒模擬另一個使用者時,Current 現在會返回程序所有者的使用者。以前,它會返回一個錯誤。

regexp

Regexp 現在實現了 encoding.TextAppender 介面。

runtime

GOROOT 函式現在已棄用。在新程式碼中,建議使用系統路徑來定位“go”二進位制檔案,並使用 go env GOROOT 來查詢其 GOROOT。

strings

strings 包添加了幾個處理迭代器的函式。

  • Lines 返回一個字串中以換行符結尾的行的迭代器。
  • SplitSeq 返回一個按分隔符分割的字串子字串迭代器。
  • SplitAfterSeq 返回一個在每次出現分隔符後分割的字串子字串迭代器。
  • FieldsSeq 返回一個根據 unicode.IsSpace 定義的,按空白字元執行分割的字串子字串迭代器。
  • FieldsFuncSeq 返回一個按滿足謂詞的 Unicode 程式碼點執行分割的字串子字串迭代器。

sync

sync.Map 的實現已更改,提高了效能,尤其是在地圖修改方面。例如,修改不相交鍵集合的地圖在高併發地圖上發生衝突的可能性大大降低,並且地圖從低併發負載中獲得的效能不再需要有任何啟動時間。

如果您遇到任何問題,請在構建時設定 GOEXPERIMENT=nosynchashtriemap 來切換回舊實現,並請 提交 issue

testing

新的 T.ContextB.Context 方法返回一個上下文,該上下文在測試完成並且測試清理函式執行之前被取消。

新的 T.ChdirB.Chdir 方法可用於在測試或基準測試期間更改工作目錄。

text/template

模板現在支援 range-over-func 和 range-over-int。

time

Time 現在實現了 encoding.BinaryAppenderencoding.TextAppender 介面。

移植

Linux

正如 Go 1.23 發行說明 中公佈 的那樣,Go 1.24 需要 Linux 核心版本 3.2 或更高版本。

Darwin

Go 1.24 是最後一個支援 macOS 11 Big Sur 的版本。Go 1.25 將需要 macOS 12 Monterey 或更高版本。

WebAssembly

添加了 go:wasmexport 編譯器指令,供 Go 程式將函式匯出到 WebAssembly 主機。

在 WebAssembly 系統介面預覽版 1 (GOOS=wasip1 GOARCH=wasm) 上,Go 1.24 支援透過指定 -buildmode=c-shared 構建標誌將 Go 程式構建為 reactor/library

現在允許更多型別作為 go:wasmimport 函式的引數或結果型別。具體來說,允許使用 boolstringuintptr 以及指向某些型別的指標(有關詳細資訊,請參閱 文件),以及 32 位和 64 位整數和浮點型別,以及已允許的 unsafe.Pointer。這些型別也允許作為 go:wasmexport 函式的引數或結果型別。

WebAssembly 的支援檔案已從 misc/wasm 移動到 lib/wasm

初始記憶體大小顯著減小,特別是對於小型 WebAssembly 應用程式。

Windows

32 位 Windows/ARM 埠 (GOOS=windows GOARCH=arm) 已被標記為損壞。有關詳細資訊,請參閱 issue #70705