Die neue Version von Go, Version 1.24, erscheint sechs Monate nach Go 1.23. Die meisten Änderungen betreffen die Implementierung des Toolchains, der Laufzeit und der Bibliotheken. Wie immer gewährleistet die Veröffentlichung das Versprechen der Kompatibilität Go 1. Die Entwickler der Sprache erwarten, dass fast alle Go-Programme weiterhin wie gewohnt kompiliert und funktionieren.
Änderungen in der Sprache
Go 1.24 unterstützt jetzt vollständig generische Typalias: Ein Typalias kann parametrisiert werden wie ein deklarierter Typ. Weitere Details finden Sie in der Sprachspezifikation. Momentan kann diese Möglichkeit durch das Setzen von GOEXPERIMENT=noaliastypeparams deaktiviert werden; jedoch wird die Option aliastypeparams in Go 1.25 entfernt.
Werkzeuge
Der Befehl go
Go-Module können jetzt ausführbare Abhängigkeiten verfolgen, indem die Tool-Direktive in go.mod verwendet wird. Dies beseitigt die Notwendigkeit einer vorherigen Umgehungslösung, um Tools als leere Importe in die Datei hinzuzufügen, die normalerweise 'tools.go' genannt wird. Der Befehl go tool kann jetzt diese Tools zusätzlich zu den mit Go gelieferten Tools ausführen. Weitere Informationen sind zu finden in Dokumentation.
Das neue Flag -tool für go get führt zur Hinzufügung der Werkzeugdirektive zum aktuellen Modul für die angegebenen Pakete, zusätzlich zur Hinzufügung der Abhängigkeitsdirektiven.
Neu Meta-Muster tool verweist auf alle Werkzeuge im aktuellen Modul. Dies kann verwendet werden, um sie alle über go get tool zu aktualisieren oder um sie in Ihr GOBIN-Verzeichnis über go install tool zu installieren.
Ausführbare Dateien, die über go run erstellt wurden, und das neue Verhalten von go tool werden jetzt im Go-Build-Cache zwischengespeichert. Dies optimiert wiederholte Ausführungen dank erhöhtem Cache. #69290.
Die Befehle go build und go install akzeptieren jetzt das Flag -json, das Ausgaben und Build-Fehler als strukturierten JSON-Ausgabe auf der Standardausgabe meldet. Einzelheiten zum Format finden Sie in go help buildjson.
Darüber hinaus meldet go test -json jetzt Ausgaben und Build-Fehler in JSON, vermischt mit dem Testresultat-JSON. Diese können aufgrund neuer Action-Typen unterschieden werden, aber wenn sie Problem im Testintegrationssystem verursachen, kann man auf die textuelle Build-Ausgabe über die Einstellung GODEBUG gotestjsonbuildtext=1. zurückgreifen.
Die neue Umgebungsvariable GOAUTH bietet eine flexible Möglichkeit zur Autorisierung privater Modulimporte. Detaillierte Informationen finden Sie in go help goauth.
Der Befehl go build installiert jetzt die Version des Hauptmoduls im kompilierten Binärformat, basierend auf dem Tag und/oder dem Commit des Versionskontrollsystems. Der Suffix +dirty wird hinzugefügt, falls nicht kommittierte Änderungen vorhanden sind. Der Flag -buildvcs=false kann verwendet werden, um Versionierungshinweise aus dem Binärformat zu entfernen.
Neu GODEBUG-Einstellung toolchaintrace=1 kann jetzt verwendet werden, um den Prozess der Auswahl des Toolchains im Befehl go zu verfolgen.
Cgo
Cgo unterstützt neue Annotationen für C-Funktionen zur Verbesserung der Laufzeitleistung. #cgo noescape cFunctionName teilt dem Compiler mit, dass der an die C-Funktion cFunctionName übergebene Speicher nicht entglitten darf. #cgo nocallback cFunctionName teilt dem Compiler mit, dass die C-Funktion cFunctionName keine Go-Funktionen zurückruft. Weitere Informationen sind in der Cgo-Dokumentation.
Cgo lehnt derzeit kompilierte Aufrufe von C-Funktionen ab, die mehrere inkonsistente Deklarationen haben. Beispielsweise, wenn f sowohl als void f(int) als auch als void f(double) deklariert ist, wird cgo einen Fehler melden, anstatt eine falsche Aufrufsequenz für f(0) zu generieren. Neu in dieser Version ist die verbesserte Erkennung dieses Fehlerzustands, wenn inkompatible Deklarationen in verschiedenen Dateien auftreten. #67699.
Objdump
Das Tool objdump unterstützt jetzt das Disassemblieren auf 64-Bit LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) und S390X (GOARCH=s390x).
Vet
Der neue Tests-Analyzer meldet häufige Fehler in Testdeklarationen, Fuzzern, Benchmarks und Beispielen in Testpaketen, wie z. B. falsch formatierte Namen, ungültige Signaturen oder Beispiele, die nicht existierende Identifikatoren dokumentieren. Einige dieser Fehler können dazu führen, dass Tests nicht ausgeführt werden.
Der bestehende printf-Analyzer meldet jetzt Diagnosen für Aufrufe der Form fmt.Printf(s), wobei s ein String mit nicht konstantem Format ist, ohne weitere Argumente. Solche Aufrufe sind fast immer ein Fehler, da der Wert s das Zeichen % enthalten kann; verwenden Sie stattdessen fmt.Print. 60529. Diese Überprüfung neigt dazu, Funde im bestehenden Code zu machen, und wird daher nur angewendet, wenn die Sprachversion (festgelegt durch die Anweisung go im go.mod-Datei oder durch die Kommentare `//go:build) mindestens Go 1.24 beträgt, um zu vermeiden, dass bei der Aktualisierung auf das Go 1.24-Toolchain dauerhafte Integrationsfehler auftreten.
Der vorhandene buildtag-Analyser gibt nun Diagnosen aus, wenn es eine falsche Build-Einschränkung der älteren Version gibt. Go-Direktive //go:build. Zum Beispiel verweist //go:build go1.23.1 auf ein Punkt-Release; stattdessen verwenden Sie //go:build go1.23. #64127.
Der vorhandene copylock-Analyser gibt nun Diagnosen aus, wenn eine Variable, die in einer dreifachen 'for'-Schleife deklariert wird, wie for i := iter(); done(i); i = next(i) { ... }, ein sync.Locker wie sync.Mutex enthält. Go 1.22 änderte das Verhalten solcher Schleifen so, dass jede Iteration eine neue Variable erstellt und Werte von der vorherigen Iteration kopiert; diese Kopie ist für Locks unsicher. #66387.
GOCACHEPROG
Das interne Binärprogramm cmd/go und der Test-Caching-Mechanismus können jetzt von Kindprozessen implementiert werden, die über ein JSON-Protokoll zwischen dem cmd/go-Tool und dem Kindprozess kommunizieren, benannt durch die Umgebungsvariable GOCACHEPROG. Zuvor war dies durch GOEXPERIMENT möglich. Details des Protokolls sind zu sehen in Dokumentation.
Ausführungszeit
Mehrere Leistungsverbesserungen in der Runtime haben die CPU-Overhead um durchschnittlich 2–3 % innerhalb einer Reihe von repräsentativen Benchmarks reduziert. Die Ergebnisse können je nach Anwendung variieren. Diese Verbesserungen umfassen eine neue eingebaute Implementierung von Maps, die auf Schwedischen Tabellen, effizienterem Speicher für kleine Objekte und einer neuen internen Runtime-Implementierung von Mutexen.
Die neue eingebaute Implementierung von Maps und der neue interne Runtime-Mutex können während des Builds durch die Einstellungen GOEXPERIMENT=noswissmap und GOEXPERIMENT=nospinbitmutex deaktiviert werden.
Compiler
Der Compiler hat bereits das Definieren neuer Methoden mit Empfängertypen, die mit cgo generiert wurden, verboten, aber es war möglich, dieses Verbot durch Typalias zu umgehen. Go 1.24 gibt jetzt immer einen Fehler aus, wenn der Empfänger einen generierten cgo-Typ direkt oder indirekt (durch Typalias) bezeichnet.
Linker
Der Linker generiert jetzt standardmäßig eine GNU-Build-ID (Eintrag ELF NT_GNU_BUILD_ID) auf ELF-Plattformen und UUID (Mach-O LC_UUID-Boot-Befehl) auf macOS. Die Build-ID oder UUID wird aus der Build-ID von Go abgeleitet. Dies kann mit dem Linker-Flag -B none deaktiviert oder mit dem Linker-Flag -B 0xNNNN mit einem benutzerdefinierten hexadezimalen Wert überschrieben werden.
Rollout
Wie in den Release-Notizen zu Go 1.22 angegeben, Go 1.24 erfordert jetzt Go 1.22.6 oder später zum Kompilieren. Die Entwickler erwarten, dass Go 1.26 zum Kompilieren ein Patch-Release von Go 1.24 oder später benötigen wird.
Standardbibliothek
Eingeschränkter Verzeichniszugriff auf das Dateisystem
Neuer Typ os.Root ermöglicht es, Dateisystemoperationen innerhalb eines bestimmten Verzeichnisses auszuführen.
Funktion os.OpenRoot öffnet ein Verzeichnis und gibt zurück os.Root. Die Methoden auf os.Root arbeiten innerhalb dieses Verzeichnisses und erlauben keine Pfade, die auf Standorte außerhalb des Verzeichnisses verweisen, einschließlich solcher, die symbolischen Links außerhalb des Verzeichnisses folgen. Die Methoden auf os.Root spiegeln die meisten Dateisystemoperationen wieder, die im os-Paket verfügbar sind, einschließlich zum Beispiel os.Root.Open, os.Root.Create, os.Root.Mkdir und os.Root.Stat.
Neue Benchmark-Funktion
Benchmarks können jetzt eine schnellere und weniger fehleranfällige Methode testing.B.Loop für Iterationen in Benchmarks wie for b.Loop() { … } anstelle typischer Schleifenstrukturen mit b.N wie for range b.N verwenden. Das bietet zwei wesentliche Vorteile:
- Die Benchmark-Funktion wird genau einmal pro -count ausgeführt, wodurch zeitaufwendige Einrichtungsschritte und Aufräumarbeiten nur einmal durchgeführt werden.
- Die Parameter der Funktionsaufrufe und die Ergebnisse bleiben erhalten, was verhindert, dass der Compiler den Schleifenrumpf vollständig optimiert.
Verbesserte Finalisierer
Eine neue Funktion runtime.AddCleanup ist ein Abschlussmechanismus, der flexibler, effizienter und weniger fehleranfällig ist als runtime.SetFinalizer. AddCleanup hängt eine Aufräumfunktion an ein Objekt, die ausgeführt wird, sobald das Objekt unzugänglich wird. Im Gegensatz zu SetFinalizer können jedoch mehrere Aufräumfunktionen an ein einzelnes Objekt angehängt werden, Aufräumfunktionen können an interne Zeiger angehängt werden, und Aufräumfunktionen verursachen in der Regel keine Speicherlecks, wenn Objekte eine Schleife bilden, und sie verzögern nicht die Freigabe des Objekts oder der Objekte, auf die es verweist. Neuer Code sollte AddCleanup vor SetFinalizer vorziehen.
Neues Paket weak
Neues Paket weak stellt schwache Zeiger bereit.
Schwache Zeiger sind ein niedrigstufiges Primitive, das bereitgestellt wird, um Strukturen zu erstellen, die den Speicher effektiv nutzen, wie z.B. schwache Wörterbücher zur Zuordnung von Werten, Kanonisierung von Wörterbüchern für alles, was nicht vom Paket unique, und verschiedene Arten von Caches. Um diese Benutzerfälle zu unterstützen, bietet diese Version auch runtime.AddCleanup und maphash.Comparable.
Ein neues Paket crypto/mlkem
Neues Paket crypto/mlkem implementiert ML-KEM-768 und ML-KEM-1024.
ML-KEM ist ein post-quanten Schlüsselvereinbarungsmechanismus, der früher als Kyber bekannt war und in FIPS 203.
Neue Pakete crypto/hkdf, crypto/pbkdf2 und crypto/sha3
Neues Paket crypto/hkdf implementiert die auf HMAC basierende Schlüsselableitungsfunktion "Extract-and-Expand" HKDF, wie in RFC 5869.
Neues Paket crypto/pbkdf2 implementiert die passwortbasierte Schlüsselableitungsfunktion PBKDF2, wie in RFC 8018.
Neues Paket crypto/sha3 implementiert die Hash-Funktion SHA-3 sowie SHAKE und cSHAKE-Funktionen für erweiterte Ausgaben, wie in FIPS 202.
Alle drei Pakete basieren auf zuvor existierenden Paketen von golang.org/x/crypto/….
FIPS 140-3 Compliance
Diese Version enthält einen neuen Satz von Mechanismen zur Gewährleistung der Compliance mit FIPS 140-3.
Das Krypto-Modul von Go ist eine Sammlung interner Pakete der Standardbibliothek, die transparent verwendet werden, um genehmigte FIPS 140-3 Algorithmen zu implementieren. Anwendungen erfordern keine Änderungen, um das Krypto-Modul von Go für genehmigte Algorithmen zu verwenden.
Die neue Umgebungsvariable GOFIPS140 kann zur Auswahl der Version des Krypto-Moduls von Go verwendet werden, die in der Kompilierung verwendet werden soll. Neu GODEBUG-Einstellung fips140 kann zur Aktivierung des Modus FIPS 140-3 zur Laufzeit verwendet werden.
Go 1.24 enthält die Version v1.0.0 des Krypto-Moduls von Go, das derzeit mit einem akkreditierten CMVP-Labor getestet wird.
Ein neues experimentelles Paket testing/synctest
Ein neues experimentelles Paket testing/synctest bietet Unterstützung für das Testen von konkurrierendem Code.
- Funktion synctest.Run führt eine Gruppe von Goroutinen in einer isolierten "Blase" aus. In der Blase operieren die Funktionen des Pakets time auf falschen Uhren.
- Funktionen synctest.Wait wartet darauf, dass alle Goroutinen im aktuellen Blasenspeicher blockiert sind.
Details können in der Dokumentation des Pakets eingesehen werden.
Das Paket synctest ist experimentell und muss durch Setzen von GOEXPERIMENT=synctest aktiviert werden. Die API des Pakets kann sich in zukünftigen Versionen ändern. In #67434 können weitere Details eingesehen und Feedback gegeben werden.
Kleine Änderungen in der Bibliothek
archive
Implementierungen (*Writer.AddFS) im archive/zip und archive/tar schreiben jetzt das Verzeichnis-Header für leere Verzeichnisse.
bytes
Paket bytes fügt mehrere Funktionen hinzu, die mit Iteratoren arbeiten:
- Lines gibt einen Iterator über durch neue Zeilen getrennte Zeichenfolgen im Byte-Slice zurück.
- SplitSeq gibt einen Iterator über alle Teilslices des Byte-Slices zurück, das durch einen Separator getrennt ist.
- SplitAfterSeq gibt einen Iterator über Teilslices des Byte-Slices zurück, das nach jedem Auftreten des Separators getrennt ist.
- FieldsSeq gibt einen Iterator über Teilslices des Byte-Slices zurück, die um Sequenzen von Leerzeichen herum definiert sind. unicode.IsSpace
- FieldsFuncSeq gibt einen Iterator über Teilslices des Byte-Slices zurück, die um Sequenzen von Unicode-Codepunkten herum definiert sind, die einem Prädikat entsprechen.
crypto/aes
Der zurückgegebene Wert NewChipher implementiert nicht mehr die Methoden NewCTR, NewGCM, NewCBCEncrypter und NewCBCDecrypter. Diese Methoden waren nicht dokumentiert und nicht auf allen Architekturen verfügbar. Jetzt ist der Wert Block muss direkt an die entsprechenden Funktionen übergeben werden crypto/cipher. Derzeit überprüft crypto/cipher immer noch diese Methoden für Block-Werte, auch wenn sie nicht mehr von der Standardbibliothek unterstützt werden.
crypto/cipher
Eine neue Funktion NewGCMWithRandomNonce gibt zurück AEAD, der AES-GCM implementiert, indem er während Seal eine zufällige Einmal-Nummer generiert und sie am Anfang des verschlüsselten Textes hinzufügt.
Implementierung Stream, der zurückgegeben wird NewCTR in Kombination mit crypto/aes jetzt mehrere Male schneller auf amd64 und arm64.
NewOFB, NewCFBEncrypter und NewCFBDecrypter sind jetzt als veraltet deklariert. Die Modi OFB und CFB sind nicht authentifiziert, was aktiven Angriffen ermöglicht, den Klartext zu manipulieren und wiederherzustellen. Anwendungen wird empfohlen, AEAD stattdessen zu verwenden. Wenn ein nicht authentifizierter Modus Stream notwendig ist, kann NewCTR stattdessen verwendet werden.
crypto/ecdsa
PrivateKey.Sign erzeugt jetzt eine deterministische Signatur gemäß RFC 6979, wenn die Zufallsquelle nil ist.
crypto/md5
Der zurückgegebene Wert md5.New, implementiert jetzt auch die Schnittstelle encoding.BinaryAppender.
crypto/rand
Funktion Lesen garantiert jetzt das Fehlen von Fehlern. Wenn Read während des Lesens auf einen Fehler stößt Reader, wird das Programm sofort beendet. Beachten Sie, dass der Standard-Reader dokumentiert ist, immer erfolgreich zu arbeiten, daher sollte diese Änderung nur Programme betreffen, die die Variable Reader überschreiben. Eine Ausnahme bilden Linux-Kernel vor Version 3.17, in denen der Standard-Reader immer noch /dev/urandom öffnet und fehlschlagen kann.
Unter Linux 6.11 und höher verwendet der Reader jetzt den Systemaufruf getrandom über vDSO. Dies ist mehrere Male schneller, normalerweise für kleine Lesevorgänge.
Unter OpenBSD verwendet der Reader jetzt arc4random_buf(3).
Eine neue Funktion Text kann jetzt kryptografisch sichere Zufallszeichenfolgen generieren.
crypto/rsa
GenerateKey gibt jetzt einen Fehler zurück, wenn ein Schlüssel mit weniger als 1024 Bit angefordert wird. Alle Methoden Sign, Verify, Encrypt und Decrypt geben jetzt einen Fehler zurück, wenn sie mit einem Schlüssel kleiner als 1024 Bit verwendet werden. Solche Schlüssel sind unsicher und sollten nicht genutzt werden. GODEBUG-Konfiguration rsa1024min=0 stellt das alte Verhalten wieder her, aber die Go-Entwickler empfehlen dies nur bei Bedarf und nur in Tests, indem man z. B. die Zeile //go:debug rsa1024min=0 in die Testdatei einfügt. Neu Beispiel GenerateKey stellt einen einfach zu verwendenden 2024-Bit-Testschlüssel bereit.
Es ist jetzt sicherer und effizienter, PrivateKey.Precompute bis PrivateKey.Validate. Precompute ist jetzt schneller bei teilweise gefüllten PrecomputedValues, z. B. beim Abrufen des Schlüssels aus JSON.
Das Paket verwirft jetzt mehr ungültige Schlüssel, auch wenn Validate nicht aufgerufen wird, und GenerateKey kann jetzt neue Fehler für fehlerhafte Zufallsquellen zurückgeben. Die Felder Primes und Precomputed Strukturen PrivateKey werden jetzt verwendet und validiert, selbst wenn einige Werte fehlen. Auch in crypto/x509 wurden Änderungen an der Analyse und dem Abruf von RSA-Schlüsseln vorgenommen, die im Folgenden beschrieben werden.
SignPKCS1v15 und VerifyPKCS1v15 unterstützen jetzt SHA-512/224, SHA-512/256 und SHA-3.
GenerateKey verwendet jetzt eine etwas andere Methode zur Erzeugung der privaten Exponenten (Karmichels Funktion anstelle der Eulerschen Funktion). Seltene Anwendungen, die Schlüssel nur aus Primzahlen neu erstellen, können unterschiedliche, aber kompatible Ergebnisse erzeugen.
Operationen mit öffentlichen und privaten Schlüsseln sind jetzt bis zu zweimal schneller auf wasm.
crypto/sha*
- crypto/sha1: Der Wert, der zurückgegeben wird von sha1.New implementiert jetzt ebenfalls das Interface encoding.BinaryAppender.
- crypto/sha256: Die Werte, die zurückgegeben werden von sha256.New und sha256.New224 implementiert jetzt ebenfalls das Interface encoding.BinaryAppender.
- crypto/sha512: Die Werte, die zurückgegeben werden von sha512.New, sha512.New384, sha512.New512_224 und sha512.New512_256, implementiert jetzt ebenfalls das Interface encoding.BinaryAppender.
crypto/subtle
Eine neue Funktion WithDataIndependentTiming ermöglicht es dem Benutzer, eine Funktion mit aktivierten architekturspezifischen Funktionen auszuführen, die garantieren, dass bestimmte Anweisungen bezüglich der Zeit der Datenwerte unverändert bleiben. Dies kann verwendet werden, um sicherzustellen, dass der für konstante Zeit entwickelte Code nicht durch Prozessor-Level-Funktionen so optimiert wurde, dass er in variabler Zeit arbeitet. Momentan verwendet WithDataIndependentTiming das Bit PSTATE.DIT auf arm64 und führt auf allen anderen Architekturen nichts aus. GODEBUG-Konfiguration dataindependenttiming=1 aktiviert den DIT-Modus für das gesamte Go-Programm.
Ausgabe XORBytes muss entweder vollständig oder nicht mit der Eingabe überlappen. Das vorherige Verhalten war unbestimmt, jetzt wird XORBytes eine Panik auslösen.
crypto/tls
Der TLS-Server unterstützt jetzt den Encrypted Client Hello (ECH). Diese Funktion kann durch das Ausfüllen des Feldes aktiviert werden. Config.EncryptedClientHelloKeys.
Ein neuer post-quanten Schlüssel-Austauschmechanismus X25519MLKEM768 wird jetzt unterstützt und ist standardmäßig aktiviert, wenn Config.CurvePreferences nil ist. GODEBUG-Konfiguration tlsmlkem=0 gibt den Standard zurück.
Die Unterstützung für den experimentellen Schlüssel-Austausch X25519Kyber768Draft00 wurde entfernt.
Der Schlüssel-Austauschprozess wird jetzt vollständig im Paket crypto/tls behandelt. Die Reihenfolge Config.CurvePreferences wird jetzt ignoriert, und der Inhalt wird nur verwendet, um zu bestimmen, welche Schlüssel-Austausche aktiviert werden sollen, wenn das Feld ausgefüllt ist.
Das neue Feld ClientHelloInfo.Extensions listet die Liste der von der Client Hello-Nachricht empfangenen Erweiterungs-IDs auf. Dies kann nützlich sein, um TLS-Client-Fingerabdrücke zu erstellen.
crypto/x509
GODEBUG-Konfiguration x509sha1 wurde entfernt. Certificate.Verify unterstützt keine auf SHA-1 basierenden Signaturen mehr.
OID implementiert jetzt die Schnittstellen encoding.BinaryAppender und encoding.TextAppender.
Das Standardfeld für Zertifikatsrichtlinien wurde geändert von Certificate.PolicyIdentifiers auf Certificate.Policies. Beim Parsen von Zertifikaten werden beide Felder ausgefüllt, aber bei der Erstellung von Zertifikatsrichtlinien werden diese aus dem Feld Certificate.Policies anstelle von Certificate.PolicyIdentifiers übernommen. Diese Änderung kann durch die Einstellung GODEBUG x509usepolicies=0 zurückgesetzt werden.
CreateCertificate wird jetzt eine Seriennummer generieren, die eine RFC 5280-konforme Methode verwendet, wenn das Vorlagelfeld Certificate.SerialNumber nil ist, anstatt einen Fehler auszulösen.
Certificate.Verify unterstützt jetzt die Validierung von Richtlinien, wie in RFC 5280 und RFC 9618 definiert. Das neue Feld VerifyOptions.CertificatePolicies kann auf eine akzeptable Menge von Richtlinien OIDs gesetzt werden.. Nur Zertifikatketten mit gültigen Politikfeldern werden zurückgegeben aus Certificate.Verify.
MarshalPKCS8PrivateKey gibt jetzt einen Fehler zurück, anstatt den falschen RSA-Schlüssel zu extrahieren. (MarshalPKCS1PrivateKey fühlt keinen Fehler zurück und sein Verhalten bei falschen Schlüsseln bleibt weiterhin undefiniert.)
ParsePKCS1PrivateKey und ParsePKCS8PrivateKey verwendet jetzt und validiert kodierte CRT-Werte, sodass falsche RSA-Schlüssel, die zuvor akzeptiert wurden, abgelehnt werden können. Die Verwendung der GODEBUG-Einstellungen x509rsacrt=0 kehrt zur Neuberechnung der CRT-Werte zurück.
debug/elf
Paket debug/elf fügt Unterstützung für die Verarbeitung von Versions-Symbolen in dynamischen ELF-Dateien (Executable and Linkable Format) hinzu. Neue Methode File.DynamicVersions gibt eine Liste der dynamischen Versionen zurück, die in der ELF-Datei definiert sind. Neue Methode File.DynamicVersionNeeds gibt eine Liste der dynamischen Versionen zurück, die von dieser ELF-Datei benötigt werden und die in anderen ELF-Objekten definiert sind. Schließlich zeigen die neuen Felder Symbol.HasVersion und Symbol.VersionIndex die Version des Symbols an.
encoding
Zwei neue Schnittstellen TextAppender und BinaryAppender wurden eingeführt, um die textuelle oder binäre Darstellung eines Objekts zu einem Byte-Slice hinzuzufügen. Diese Schnittstellen bieten die gleiche Funktionalität wie TextMarshaler und BinaryMarshaler, aber anstatt jedes Mal einen neuen Slice zu erstellen, fügen sie die Daten direkt in den vorhandenen Slice ein. Diese Schnittstellen werden jetzt von Typen der Standardbibliothek implementiert, die bereits TextMarshaler und/oder BinaryMarshaler implementieren.
encoding/json
Beim Aufbau wird das Strukturfeld mit der neuen Option omitzero im Tag des Strukturfeldes weggelassen, wenn sein Wert null ist. Wenn der Typ des Feldes die Methode IsZero() bool hat, wird sie verwendet, um festzustellen, ob der Wert null ist. Andernfalls ist der Wert null, wenn er null ist für seinen Typ. Der Tag omitzero ist übersichtlicher und weniger fehleranfällig als omitempty, wenn die Absicht darin besteht, null-Werte zu überspringen. Insbesondere, im Gegensatz zu omitempty lässt omitzero null time.Time -Werte weg, was eine häufige Quelle von Problemen ist.
Wenn sowohl omitempty als auch omitzero festgelegt sind, wird das Feld weggelassen, wenn der Wert leer oder null ist (oder beides gleichzeitig).
UnmarshalTypeError.Field enthält jetzt eingebettete Strukturen, um detailliertere Fehlermeldungen bereitzustellen.
go/types
Alle Datenstrukturen go/types, die Methodenpaare wie Len() int und At(int) T darstellen, haben jetzt auch Methoden, die Iteratoren zurückgeben, was die Vereinfachung des Codes wie folgt ermöglicht:
params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }
Für dieses:
for param := range fn.Signature().Params().Variables() { use(param) }
Methoden: Interface.EmbeddedTypes Interface.ExplicitMethods Interface.Methods MethodSet.Methods Named.Methods Scope.Children Struct.Fields Tuple.Variables TypeList.Types TypeParamList.TypeParams Union.Terms
hash/*
- hash/adler32: Der Wert, der zurückgegeben wird von Neu, implementiert jetzt auch die Schnittstelle encoding.BinaryAppender
- hash/crc32: Die Werte, die zurückgegeben werden von Neu und NewIEEE, implementiert jetzt ebenfalls das Interface encoding.BinaryAppender
- hash/crc64: Der Wert, der zurückgegeben wird von Neu, implementiert jetzt auch die Schnittstelle encoding.BinaryAppender
- hash/fnv: Die Werte, die zurückgegeben werden von New32 New32a New64 New64a New128 und New128a, implementiert jetzt ebenfalls das Interface encoding.BinaryAppender
- hash/maphash: neue Funktionen Comparable und WriteComparable können den Hash eines beliebigen vergleichbaren Wertes berechnen. Dies ermöglicht das Hashing von allem, was als Schlüssel für ein Go-Wörterbuch verwendet werden kann.
log/slog
Neu DiscardHandler ist ein Handler, der niemals aktiviert wird und immer seine Ausgabe verwirft.
Level und LevelVar implementieren jetzt das Interface encoding.TextAppender.
math/*
- math/big: Float, Int und Rat implementieren jetzt das Interface encoding.TextAppender.
- math/rand: Aufrufe der veralteten High-Level-Funktion Seed haben keinen Effekt mehr. Um das alte Verhalten wiederherzustellen, kann die Einstellung die Einstellung GODEBUG randseednop=0 verwendet werden. Mehr Kontext in Angebot 67273.
- math/rand/v2: ChaCha8 und PCG implementieren jetzt das Interface encoding.BinaryAppender.
net
ListenConfig verwendet jetzt MPTCP standardmäßig auf Systemen, wo dies unterstützt wird (vorerst nur Linux).
IP implementieren jetzt das Interface encoding.TextAppender.
net/http
Die Grenze wurde geändert Transport für eintreffende Informationsantworten 1xx auf Anfragen. Früher stoppte dies die Anfrage und gab einen Fehler zurück, nachdem mehr als 5 Antworten 1xx erhalten wurden. Jetzt gibt es nur einen Fehler, wenn die Gesamtgröße aller 1xx-Antworten die Konfigurationseinstellung überschreitet Transport.MaxResponseHeaderBytes.
Darüber hinaus gibt es jetzt keine Begrenzung für die Gesamtzahl der Antworten 1xx, wenn der Request einen Hook zur Verfolgung hat net/http/httptrace.ClientTrace.Got1xxResponse, Kann der Hook Got1xxResponse einen Fehler zurückgeben, um die Anfrage zu stoppen.
Transport und Server haben jetzt ein HTTP2-Feld, das die Konfiguration der HTTP/2-Protokolleinstellungen erlaubt.
Neue Felder Server.Protocols und Transport.Protocols bieten einen einfachen Weg, zu konfigurieren, welche Protokolle der HTTP-Server oder -Client verwendet.
Server und Client können konfiguriert werden, um unverschlüsselte HTTP/2-Verbindungen zu unterstützen.
Wenn Server.Protocols UnencrypterHTTP2 enthält, akzeptiert der Server HTTP/2-Verbindungen auf unverschlüsselten Ports. Der Server kann sowohl HTTP/1 als auch unverschlüsseltes HTTP/2 an demselben Port akzeptieren.
Wenn Transport.Protocols enthält UnencryptedHTTP2 und enthält kein HTTP1, der Transport verwendet unverschlüsseltes HTTP/2 für Adressen http://. Wenn der Transport so konfiguriert ist, dass er sowohl HTTP/1 als auch unverschlüsseltes HTTP/2 verwendet, wird er HTTP/1 verwenden.
Die Unterstützung für unverschlüsseltes HTTP/2 verwendet „HTTP/2 mit vorherigem Wissen“ (RFC 9113, Abschnitt 3.3). Der veraltete Header „Upgrade: h2c“ wird nicht unterstützt.
net/netip
Addr, AddrPort und Prefix implementieren jetzt Schnittstellen encoding.BinaryAppender und encoding.TextAppender.
net/url
URL implementiert jetzt ebenfalls das Interface encoding.BinaryAppender.
os/user
In Windows Aktuell kann jetzt im Windows Nano Server verwendet werden. Die Implementierung wurde aktualisiert, um die Verwendung von Funktionen aus der NetApi32-Bibliothek zu vermeiden, die im Nano Server nicht vorhanden ist.
In Windows Aktuell, Lookup und LookupId unterstützen jetzt die folgenden integrierten Dienstkonten für Benutzer:
- NT AUTHORITYSYSTEM
- NT AUTHORITYLOCAL SERVICE
- NT AUTHORITYNETWORK SERVICE
In Windows Aktuell wurde erheblich beschleunigt, wenn der aktuelle Benutzer mit einer langsamen Domäne verbunden ist, was für viele Unternehmensbenutzer üblich ist. Die neue Implementierungsleistung liegt jetzt im Millisekundenbereich, im Vergleich zur vorherigen Implementierung, die mehrere Sekunden oder sogar Minuten für den Abschluss benötigte.
In Windows Aktuell gibt jetzt den Benutzer des Prozessbesitzers zurück, wenn der aktuelle Thread sich als ein anderer Benutzer ausgibt. Früher gab es einen Fehler zurück.
regexp
Regexp implementieren jetzt das Interface encoding.TextAdapter.
laufzeit
Funktion GOROOT wurde jetzt als veraltet erklärt. In neuem Code sollte die Verwendung des Systempfads zur Bestimmung des Binärdateipfads für „go“ bevorzugt werden, und go env GOROOT sollte verwendet werden, um GOROOT zu bestimmen.
strings
Paket strings fügt mehrere Funktionen zur Arbeit mit Iteratoren hinzu:
- Lines gibt einen Iterator über die durch neue Zeilen getrennten Zeilen in einer Zeichenkette zurück.
- SplitSeq gibt einen Iterator über alle Teilzeichenfolgen der Zeichenkette zurück, die durch einen Separator getrennt sind.
- SplitAfterSeq gibt einen Iterator über Teilzeichenfolgen der Zeichenkette zurück, die nach jedem Auftreten des Separators getrennt sind.
- FieldsSeq gibt einen Iterator über Teilzeichenfolgen der Zeichenkette zurück, die um Sequenzen von Leerzeichen herum definiert sind, wie festgelegt.unicode.IsSpace
- FieldsFuncSeq gibt einen Iterator über Teilzeichenfolgen der Zeichenkette zurück, die um Sequenzen von Unicode-Codepunkten herum definiert sind, die dem Prädikat entsprechen.
sync
Implementierung sync.Map wurde modifiziert und verbessert die Leistung, insbesondere bei Änderungen am Wörterbuch. Beispielsweise ist es weniger wahrscheinlich, dass Änderungen an nicht überlappenden Mengen in großen Wörterbüchern miteinander konkurrieren, und es ist keine Aufwärmzeit mehr erforderlich, um niedrige Wettbewerbslasten im Wörterbuch zu erreichen.
Wenn Sie auf Probleme stoßen, setzen Sie GOEXPERIMENT=nosynchashtriemap während des Builds, um zur alten Implementierung zurückzukehren, und bitte das Problemmeldungsformular ausfüllen.
Testen
Neue Methoden T.Context und B.Context geben den Kontext zurück, der nach Abschluss des Tests und vor der Ausführung der Aufräumfunktionen ungültig wird.
Neue Methoden T.Chdir und B.Chdir können verwendet werden, um das Arbeitsverzeichnis während der Ausführung des Tests oder Benchmarks zu ändern.
text/template
Vorlagen unterstützen jetzt range-over-func und range-over-int.
time
Zeit implementiert jetzt die Schnittstellen encoding.BinaryAppender und encoding.TextAppender.
Ports
Linux
Wie zuvor angekündigt in den Release-Notizen von Go 1.23, Go 1.24 benötigt einen Linux-Kernel der Version 3.2 oder später.
Darwin
Go 1.24 ist die letzte Version, die auf macOS 11 Big Sur läuft. Go 1.25 wird macOS 12 Monterey oder neuer erfordern.
WebAssembly
Die Compiler-Direktive go:wasmexport wurde in Go-Programmen hinzugefügt, um Funktionen in den WebAssembly-Host zu exportieren.
In der WebAssembly System Interface Preview 1 (GOOS=wasip1 GOARCH=wasm) unterstützt Go 1.24 den Build von Go-Programmen als reactor/library durch Angabe des Build-Flags -buildmode=c-shared.
Mehr Typen sind jetzt als Argument- oder Rückgabetypen für go:wasmimport-Funktionen erlaubt. Insbesondere bool, string, uintptr und Zeiger auf bestimmte Typen sind erlaubt (Details siehe in Dokumentation), zusammen mit 32-Bit und 64-Bit Ganzzahlen und Fließkommawerten, sowie unsafe.Pointer, die bereits erlaubt sind. Diese Typen sind auch als Argument- oder Rückgabetypen für go:wasmexport-Funktionen erlaubt.
Die Unterstützungsdateien für WebAssembly wurden von misc/wasm nach lib/wasm verschoben.
Die ursprüngliche Speichermenge wurde erheblich reduziert, insbesondere für kleine WebAssembly-Anwendungen.
Windows
Der 32-Bit Port windows/arm (GOOS=windows GOARCH=arm) wurde als defekt markiert. Einzelheiten in #70705
Quelle: linux.org.ru
