Die neue Version der Programmiersprache Go, Version 1.24, erscheint sechs Monate nach Go 1.23. Die meisten Änderungen betreffen die Implementierung von Toolchain, Runtime und Bibliotheken. Wie immer bietet das Release das Versprechen der Kompatibilität. Go 1. Die Entwickler der Sprache gehen davon aus, dass fast alle Go-Programme weiterhin wie gewohnt kompiliert und ausgeführt werden können.
Änderungen in der Sprache
Go 1.24 unterstützt jetzt vollständig generische Typalias.: Ein Typalias kann als parametrisierter Typ deklariert werden. Details finden Sie in der Sprachspezifikation.. Derzeit kann diese Möglichkeit durch Setzen von GOEXPERIMENT=noaliastypeparams deaktiviert werden; jedoch wird die Option aliastypeparams in Go 1.25 entfernt.
Werkzeuge
Go-Befehle
Go-Module können jetzt ausführbare Abhängigkeiten mit der Direktive tool in go.mod verfolgen. Dies beseitigt die Notwendigkeit eines vorherigen Workarounds, um Werkzeuge als leere Importe in eine Datei hinzuzufügen, die normalerweise “tools.go” genannt wird. Der Go-Befehl kann nun diese Werkzeuge zusätzlich zu den mit Go gelieferten Werkzeugen ausführen. Weitere Informationen finden Sie in Dokumentation..
Das neue Flag -tool für go get fügt die Tool-Direktive zum aktuellen Modul für die angegebenen Pakete hinzu, zusätzlich zur Einführung von Anforderungen.
Neu Meta-Muster Tool bezieht sich auf alle Tools im aktuellen Modul. Dies kann verwendet werden, um sie alle über 'go get tool' zu aktualisieren oder um sie in das GOBIN-Verzeichnis über 'go install tool' zu installieren.
Ausführbare Dateien, die über 'go run' erstellt werden, und das neue Verhalten von 'go tool' werden jetzt im Go-Build-Cache gespeichert. Dies ermöglicht wiederholte Ausführungen mit einem vergrößerten Cache. #69290.
Die Befehle 'go build' und 'go install' akzeptieren jetzt die Flagge -json, die die Ausgaben und Fehler des Builds als strukturierten JSON-Output im Standardausgang meldet. Einzelheiten zum Format finden Sie in 'go help buildjson'.
Darüber hinaus meldet 'go test -json' jetzt die Ausgaben und Fehler des Builds in JSON, gemischt mit dem JSON der Testergebnisse. Diese können anhand neuer Action-Typen unterschieden werden, aber wenn sie Probleme im Testintegrationssystem verursachen, kann auf den textuellen Build-Ausgang über die Einstellung GODEBUG gotestjsonbuildtext=1 zurückgegriffen werden.
Die neue Umgebungsvariable GOAUTH bietet eine flexible Möglichkeit zur Autorisierung privater Modul-Downloads. Weitere Informationen finden Sie in go help goauth.
Der Befehl go build wird jetzt eingerichtet die Hauptmodulversion im kompilierten Binärformat, basierend auf dem Tag und/oder dem Commit des Versionskontrollsystems. Der Suffix +dirty wird hinzugefügt, wenn nicht festgeschriebene Änderungen vorhanden sind. Mit dem Flag -buildvcs=false kann die Versionskontrollinformation aus dem Binärformat ausgeschlossen werden.
Neu Die Einstellung GODEBUG 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 sagt dem Compiler, dass der an die C-Funktion cFunctionName übergebene Speicher nicht verloren geht. #cgo nocallback cFunctionName informiert den Compiler, dass die C-Funktion cFunctionName keine Go-Funktionen rückruft. Weitere Informationen finden Sie in der Cgo-Dokumentation.
Cgo verweigert derzeit, Aufrufe von einer Funktion zu kompilieren, die mehrere inkompatible Deklarationen hat. Wenn beispielsweise f sowohl als void f(int) als auch als void f(double) deklariert ist, wird cgo einen Fehler melden, anstatt möglicherweise eine falsche Aufrufsequenz für f(0) zu generieren. Neu in dieser Version ist die verbesserte Erkennung dieses Fehlers, 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 berichtet über häufige Fehler in den Testdeklarationen, Fuzzern, Benchmarks und Beispielen in Testpaketen, wie unsachgemäß formatierte Namen, falsche 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 berichtet nun über Diagnosen bei Aufrufen der Form fmt.Printf(s), wobei s eine nicht konstante Formatzeichenfolge ist, ohne zusätzliche Argumente. Solche Aufrufe sind fast immer ein Fehler, da der Wert von s das Zeichen % enthalten kann; verwenden Sie stattdessen fmt.Print. 60529Diese Überprüfung tendiert dazu, Funde im bestehenden Code zu machen und wird daher nur angewendet, wenn die Sprachversion (wie in der Direktive go im go.mod-Datei oder in den Kommentaren `//go:build` angegeben) mindestens Go 1.24 beträgt, um Unterbrechungen der kontinuierlichen Integration beim Upgrade auf das Go-Toolchain 1.24 zu vermeiden.
Der bestehende buildtag-Analyzer berichtet nun über Diagnosen, wenn es ein falsches Build-Grenze für ältere Versionen von Go in der Direktive //go:build gibt. Zum Beispiel verweist //go:build go1.23.1 auf einen Patch-Release; verwenden Sie stattdessen //go:build go1.23. #64127.
Der bestehende copylock-Analyzer berichtet nun über Diagnosen, wenn eine Variable, die in einer dreifachen "for"-Schleife deklariert ist, wie for i := iter(); done(i); i = next(i) { … }, sync.Locker enthält, wie sync.Mutex. Go 1.22 Verhalten solcher Schleifen geändert, um für jede Iteration eine neue Variable zu erstellen und Werte von der vorherigen Iteration zu kopieren; dieses Kopieren ist für Locks nicht sicher. #66387.
GOCACHEPROG
Das interne Binärprogramm cmd/go und der Test-Caching-Mechanismus können jetzt durch Kindprozesse implementiert werden, die das JSON-Protokoll zwischen dem Tool cmd/go und dem als Umgebungsvariable GOCACHEPROG benannten Kindprozess implementieren. Zuvor war dies unter GOEXPERIMENT. Dokumentation..
Laufzeit
Mehrere Leistungsverbesserungen in der Runtime haben die CPU-Overheads im Durchschnitt um 2-3 % in einer repräsentativen Benchmark-Gruppe gesenkt. Die Ergebnisse können je nach Anwendung variieren. Zu diesen Verbesserungen gehört eine neue eingebaute Implementierung der map basierend auf schwedischen Tabellen, einer effizienteren Speicherzuweisung kleiner Objekte und einer neuen internen Runtime-Implementierung des Mutex.
Die neue eingebaute Implementierung der map und der neue interne Runtime-Mutex können beim Build über die Einstellungen GOEXPERIMENT=noswissmap und GOEXPERIMENT=nospinbitmutex deaktiviert werden.
Compiler
Der Compiler erlaubte bereits nicht die Definition neuer Methoden mit Empfängertypen, die von cgo generiert wurden, aber es war möglich, diese Einschränkung über den Typalias zu umgehen. Go 1.24 gibt jetzt immer einen Fehler aus, wenn der Empfänger einen von cgo generierten Typ direkt oder indirekt (über einen Typalias) angibt.
Linker
Der Linker generiert jetzt standardmäßig eine GNU-Build-ID (ELF NT_GNU_BUILD_ID) auf ELF-Plattformen und eine UUID (Mach-O LC_UUID) auf macOS. Die Build-ID oder UUID wird aus der Go-Build-ID abgeleitet. Dies kann mit dem Linker-Flag -B none deaktiviert oder mit dem Linker-Flag -B 0xNNNN und einem benutzerdefinierten hexadezimalen Wert überschrieben werden.
Rollout
Wie in den Release-Hinweisen zu Go 1.22, erfordert Go 1.24 jetzt für den Rollout Go 1.22.6 oder höher. Die Entwickler erwarten, dass Go 1.26 einen Patch-Release von Go 1.24 oder höher für den Rollout verlangen wird.
Standardbibliothek
Eingeschränkter Zugriff auf das Dateisystem über ein Verzeichnis
Neuer Typ os.Root ermöglicht das Ausführen von Dateisystemoperationen innerhalb eines bestimmten Verzeichnisses.
Die Funktion os.OpenRoot öffnet ein Verzeichnis und gibt zurück os.Root. Methoden über os.Root Befehle in diesem Verzeichnis operieren und lassen keine Pfade auf Standorte außerhalb des Verzeichnisses verweisen, einschließlich derjenigen, die symbolischen Links außerhalb des Verzeichnisses folgen. Die Methoden auf os.Root spiegeln die meisten Dateisystemoperationen wider, die im Paket os verfügbar sind, einschließlich beispielsweise os.Root.Open, os.Root.Create, os.Root.Mkdir und os.Root.Stat.
Neue Benchmark-Funktion
Benchmarks können jetzt eine schnellere und fehleranfälligere Methode nutzen testing.B.Loop um Iterationen des Benchmarks wie for b.Loop() { … } anstelle typischer Schleifenstrukturen mit b.N wie for range b.N durchzuführen. Dies bietet zwei wesentliche Vorteile:
- Die Benchmark-Funktion wird genau einmal für jeden -count ausgeführt, sodass teure Einrichtungs- und Aufräumschritte nur einmal durchgeführt werden.
- Die Parameter der Funktionsaufrufe und deren Ergebnisse bleiben erhalten, wodurch der Compiler die Schleifenstruktur nicht vollständig optimieren kann.
Verbesserte Finalisierer
Neue Funktion runtime.AddCleanup ist ein Abschlussmechanismus, der flexibler, effizienter und weniger fehleranfällig ist als runtime.SetFinalizer. AddCleanup fügt eine Bereinigungsfunktion an das Objekt an, die gestartet wird, sobald das Objekt nicht mehr verfügbar ist. Im Gegensatz zu SetFinalizer können jedoch mehrere Bereinigungen an ein einzelnes Objekt angehängt werden, Bereinigungen können an interne Zeiger angehängt werden, und Bereinigungen führen normalerweise nicht zu Speicherlecks, wenn Objekte einen Zyklus bilden. Außerdem verzögern Bereinigungen nicht die Freigabe des Objekts oder der Objekte, auf die verwiesen wird. Neuer Code sollte AddCleanup gegenüber SetFinalizer bevorzugen.
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 effizient nutzen, wie schwache Wörterbücher zur Zuordnung von Werten, Kanonisierung Wörterbücher für alles, was nicht durch das Paket unique, und verschiedene Arten von Caches abgedeckt ist. Um diese Anwendungsfälle zu unterstützen, bietet diese Version auch runtime.AddCleanup und maphash.Comparable.
Neues Paket crypto/mlkem
Neues Paket crypto/mlkem implementiert ML-KEM-768 und ML-KEM-1024.
ML-KEM ist ein post-quantum Schlüsselverfahrensmechanismus, früher bekannt als Kyber und spezifiziert in FIPS 203.
Neue Pakete crypto/hkdf, crypto/pbkdf2 und crypto/sha3
Neues Paket crypto/hkdf implementiert die auf HMAC basierende Funktion zur Schlüsselerzeugung "Extract-and-Expand" HKDF, wie in RFC 5869.
Neues Paket crypto/pbkdf2 implementiert die passwortbasierte Funktion zur Schlüsselerzeugung PBKDF2, wie in RFC 8018.
Neues Paket crypto/sha3 implementiert die Hash-Funktion SHA-3 sowie die SHAKE- und cSHAKE-Funktionen mit erweiterbarem Output, wie in FIPS 202.
Alle drei Pakete basieren auf bereits bestehenden Paketen golang.org/x/crypto/…
FIPS 140-3 Compliance
Diese Version enthält ein neues Set von Mechanismen zur Gewährleistung der FIPS 140-3 Compliance.
Das kryptographische Modul Go ist eine Sammlung interner Pakete der Standardbibliothek, die transparent zur Implementierung der genehmigten FIPS 140-3 Algorithmen verwendet werden. Anwendungen erfordern keine Änderungen, um das kryptographische Modul Go für genehmigte Algorithmen zu verwenden.
Die neue Umgebungsvariable GOFIPS140 kann verwendet werden, um die Version des kryptographischen Moduls Go für den Build auszuwählen. Neu Die Einstellung GODEBUG fips140 kann verwendet werden, um den FIPS 140-3 Modus zur Laufzeit zu aktivieren.
Go 1.24 umfasst das kryptographische Modul Go Version v1.0.0, das derzeit mit einem akkreditierten CMVP-Labor getestet wird.
Neues experimentelles Paket testing/synctest
Neues experimentelles Paket testing/synctest unterstützt das Testen konkurrierenden Codes.
- Die Funktion synctest.Run startet eine Gruppe von Goroutinen in einer isolierten „Blase“. In der Blase operieren die Funktionen des Pakets time auf falschen Uhren.
- Funktionen synctest.Wait wartet, bis alle Goroutinen im aktuellen Bereich blockiert sind.
Details finden Sie in der Dokumentation des Pakets.
Das Paket synctest ist experimentell und muss durch die Einstellung GOEXPERIMENT=synctest aktiviert werden. Die API des Pakets kann sich in zukünftigen Versionen ändern. In #67434 können Sie weitere Details sehen und Feedback geben.
Minore Änderungen in der Bibliothek
archive
Implementierungen (*Writer.AddFS) in archive/zip und archive/tar schreiben jetzt den Verzeichnisheader für ein leeres Verzeichnis.
bytes
Das Paket bytes fügt einige Funktionen hinzu, die mit Iteratoren arbeiten:
- Lines gibt einen Iterator über die durch neue Zeilen getrennten Zeilen in einem Byte-Slice zurück.
- SplitSeq gibt einen Iterator über alle Teil-Slices eines Byte-Slices zurück, das durch einen Separator getrennt ist.
- SplitAfterSeq gibt einen Iterator über Teil-Slices eines Byte-Slices zurück, das nach jeder Separator-Instanz geteilt ist.
- FieldsSeq gibt einen Iterator über die Byte-Slices zurück, der um Sequenzen von Leerzeichen angeordnet ist, wie definiert unicode.IsSpace
- FieldsFuncSeq gibt einen Iterator über die Byte-Slices zurück, der um Sequenzen von Unicode-Codepunkten angeordnet ist, die dem Prädikat entsprechen.
crypto/aes
Der zurückgegebene Wert NewChipher implementiert nicht länger die Methoden NewCTR, NewGCM, NewCBCEncrypter und NewCBCDecrypter. Diese Methoden waren undocumented und auf allen Architekturen nicht verfügbar. Der aktuelle Wert Block muss direkt an die entsprechenden Funktionen übergeben werden crypto/cipher. Derzeit überprüft crypto/cipher diese Methoden weiterhin auf Block-Werten, auch wenn sie von der Standardbibliothek nicht mehr unterstützt werden.
crypto/cipher
Neue Funktion NewGCMWithRandomNonce gibt er AEAD verwendet., das AES-GCM implementiert und während des Seal einen zufälligen einmaligen Schlüssel generiert und ihn am Anfang des verschlüsselten Textes hinzufügt.
Implementierung Stream, zurückgegeben NewCTR in Verbindung mit crypto/aes jetzt mehrere Male schneller auf amd64 und arm64.
NewOFB, NewCFBEncrypter und NewCFBDecrypter sind jetzt als obsolet erklärt. Die Modi OFB und CFB sind nicht authentifiziert, was in der Regel aktiven Angriffen ermöglicht, den Klartext zu manipulieren und wiederherzustellen. Anwendungen wird empfohlen, AEAD verwendet. stattdessen zu verwenden. Wenn ein nicht authentifizierter Modus Stream erforderlich ist, kann man NewCTR anstattdessen verwenden.
crypto/ecdsa
PrivateKey.Sign generiert jetzt eine deterministische Signatur gemäß RFC 6979, wenn die Zufallsquelle nil ist.
crypto/md5
Der zurückgegebene Wert md5.New, implementiert jetzt auch das Interface encoding.BinaryAppender.
crypto/rand
Die Funktion Read garantiert jetzt das Fehlen von Fehlern. Wenn Read während des Lesens auf einen Fehler stößt, Reader, wird das Programm ohne Rückkehr beendet. Beachten Sie, dass der Standard-Reader dokumentiert ist, um immer erfolgreich zu arbeiten, daher sollte diese Änderung nur Programme betreffen, die die Variable Reader überschreiben. Eine Ausnahme bilden Linux-Kerne vor Version 3.17, bei denen der Standard-Reader weiterhin /dev/urandom öffnet und fehlschlagen kann.
In Linux 6.11 und neuer verwendet der Reader jetzt den Systemaufruf getrandom über vDSO. Dies ist mehrere Male schneller, typischerweise bei kleinen Lesevorgängen.
In OpenBSD verwendet der Reader jetzt arc4random_buf(3).
Neue Funktion Text kann jetzt kryptografisch sichere zufällige Textstrings generieren.
crypto/rsa
GenerateKey gibt jetzt einen Fehler zurück, wenn ein Schlüssel mit weniger als 1024 Bits angefordert wird. Alle Methoden Sign, Verify, Encrypt und Decrypt geben jetzt einen Fehler zurück, wenn sie mit einem Schlüssel mit weniger als 1024 Bits verwendet werden. Solche Schlüssel sind unsicher und sollten nicht verwendet werden. GODEBUG-Konfiguration rsa1024min=0 stellt das alte Verhalten wieder her, aber Go-Entwickler empfehlen dies nur bei Bedarf und nur für Tests, zum Beispiel indem Sie die Zeile //go:debug rsa1024min=0 in die Testdatei hinzufügen. Neu Nummer 00 oder GenerateKey bietet einen benutzerfreundlichen, standardmäßigen 2024-Bit-Testschlüssel.
Es ist jetzt sicherer und effizienter, PrivateKey.Precompute bis zu PrivateKey.Validate. Precompute ist jetzt schneller bei teilweise gefüllten PrecomputedValues, zum Beispiel beim Extrahieren eines Schlüssels aus JSON.
Das Paket lehnt jetzt mehr ungültige Schlüssel ab, selbst wenn Validate nicht aufgerufen wird, und GenerateKey kann jetzt neue Fehler für fehlerhafte Zufallsquellen zurückgeben. Die Felder Primes und Precomputed struct seccomp_data PrivateKey werden jetzt auch verwendet und validiert, selbst wenn einige Werte fehlen. Zudem wurden Änderungen in crypto/x509 bezüglich der Analyse und Extraktion von RSA-Schlüsseln vorgenommen, wie unten beschrieben.
SignPKCS1v15 und VerifyPKCS1v15 unterstützen jetzt SHA-512/224, SHA-512/256 und SHA-3.
GenerateKey verwendet jetzt eine etwas andere Methode zur Generierung der privaten Exponenten (Karmich-Funktion anstelle der Euler-Funktion). Seltene Anwendungen, die Schlüssel nur aus einfachen Zahlen von externen Quellen neu erstellen, können unterschiedliche, aber kompatible Ergebnisse erzeugen.
Die Operationen mit öffentlichen und privaten Schlüsseln sind jetzt bis zu zweimal schneller auf wasm.
crypto/sha*
- crypto/sha1: zurückgegebenes Wert sha1.New implementiert jetzt auch das Interface encoding.BinaryAppender.
- crypto/sha256: zurückgegebene Werte sha256.New und sha256.New224 implementieren jetzt ebenfalls das Interface encoding.BinaryAppender.
- crypto/sha512: zurückgegebene Werte sha512.New, sha512.New384, sha512.New512_224 und sha512.New512_256, implementieren jetzt ebenfalls das Interface encoding.BinaryAppender.
crypto/subtle
Neue Funktion WithDataIndependentTiming ermöglicht es dem Benutzer, eine Funktion mit aktivierten architekturspezifischen Funktionen auszuführen, die die Unveränderlichkeit bestimmter Anweisungen hinsichtlich der zeitlichen Werte von Daten gewährleisten. Dies kann verwendet werden, um sicherzustellen, dass Code, der für die Ausführung in konstanter Zeit geschrieben wurde, nicht durch Funktionen auf Prozessor-Ebene so optimiert wurde, dass er in variabler Zeit funktioniert. Derzeit verwendet WithDataIndependentTiming das Bit PSTATE.DIT auf arm64 und hat auf allen anderen Architekturen keine Funktionalität. GODEBUG-Konfiguration dataindependenttiming=1 aktiviert den DIT-Modus für das gesamte Go-Programm.
Fazit XORBytes muss entweder vollständig mit der Eingabe überlappen oder nicht. Früheres Verhalten war hinsichtlich dessen undefiniert, während XORBytes jetzt einen Panic verursachen wird.
crypto/tls
Der TLS-Server unterstützt jetzt Encrypted Client Hello (ECH). Diese Funktion kann aktiviert werden, indem das Feld Config.EncryptedClientHelloKeys.
Ein neuer post-quanten Schlüssel-Austausch-Mechanismus X25519MLKEM768 wird jetzt unterstützt und ist standardmäßig aktiviert, wenn Config.CurvePreferences nil ist. GODEBUG-Konfiguration tlsmlkem=0 gibt die Standardwerte zurück.
Die Unterstützung für den experimentellen Schlüssel-Austausch X25519Kyber768Draft00 wurde entfernt.
Der Austausch von Schlüsseln wird jetzt vollständig über das Paket crypto/tls verarbeitet. Die Reihenfolge Config.CurvePreferences wird nun ignoriert, und der Inhalt wird nur verwendet, um zu bestimmen, welche Schlüsselaustausche einbezogen werden, wenn das Feld ausgefüllt ist.
Neues Feld ClientHelloInfo.Extensions listet die Identifikatoren der Erweiterungen auf, die in der Client Hello-Nachricht empfangen wurden. Dies kann nützlich sein, um TLS-Clients zu fingerprinten.
crypto/x509
GODEBUG-Konfiguration x509sha1 wurde entfernt. Certificate.Verify unterstützt keine auf SHA-1 basierenden Signaturen mehr.
OID setzt jetzt die Schnittstellen um encoding.BinaryAppender und encoding.TextAppender.
Das Standardfeld für Zertifikatspolitiken wurde geändert von Certificate.PolicyIdentifiers findet man Certificate.Policies. Bei der Analyse von Zertifikaten werden beide Felder ausgefüllt, aber bei der Erstellung von Zertifikatspolitiken werden die Werte aus dem Feld Certificate.Policies anstelle von Certificate.PolicyIdentifiers verwendet. Diese Änderung kann zurückgesetzt werden über die GODEBUG-Einstellung x509usepolicies=0.
CreateCertificate wird jetzt eine Seriennummer generieren, die eine RFC 5280-konforme Methode beim Übergeben der Vorlage im Feld Certificate.SerialNumber nil verwendet, anstelle eines Fehlers.
Certificate.Verify unterstützt jetzt die Richtlinienvalidierung, wie in RFC 5280 und RFC 9618 definiert. Das neue Feld VerifyOptions.CertificatePolicies kann auf ein akzeptables Set von Richtlinien gesetzt werden OIDs. Es werden nur Zertifikatketten mit gültigen Richtlinien zurückgegeben von Certificate.Verify.
MarshalPKCS8PrivateKey gibt jetzt einen Fehler zurück, anstatt einen falschen RSA-Schlüssel zu extrahieren. (MarshalPKCS1PrivateKey hat keine Fehler-Rückgabe, und sein Verhalten bei bereitgestellten falschen Schlüsseln bleibt unbestimmt.)
ParsePKCS1PrivateKey und ParsePKCS8PrivateKey verwendet jetzt und validiert die kodierten CRT-Werte und kann daher ungültige RSA-Schlüssel ablehnen, die zuvor akzeptiert wurden. Die Nutzung von GODEBUG-Einstellung x509rsacrt=0 führt zurück zum Neuberechnen der CRT-Werte.
debug/elf
Das Paket debug/elf fügt Unterstützung für die Verarbeitung von Versionssymbolen 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 in anderen ELF-Objekten definiert sind. Schließlich weisen die neuen Felder Symbol.HasVersion und Symbol.VersionIndex die Version des Symbols an.
encoding
Zwei neue Schnittstellen TextAppender und BinaryAppender wurden eingeführt, um eine textuelle oder binäre Darstellung eines Objekts zu einem Byte-Slice hinzuzufügen. Diese Schnittstellen bieten die gleiche Funktionalität wie TextMarshaler und BinaryMarshaler, jedoch fügen sie die Daten direkt in das bestehende Slice ein, anstatt bei jedem Mal ein neues Slice zu reservieren. Diese Schnittstellen werden jetzt von Typen der Standardbibliothek implementiert, die bereits TextMarshaler und/oder BinaryMarshaler implementieren.
encoding/json
Bei der Konstruktion wird das Feld der Struktur mit der neuen Option omitzero im Felddesignator weggelassen, wenn sein Wert null ist. Wenn der Typ des Feldes über die Methode IsZero() bool verfügt, wird sie verwendet, um zu bestimmen, ob der Wert null ist. Andernfalls ist der Wert null, wenn er der nullwert für seinen Typ ist. Das Feldtag omitzero ist sauberer und weniger fehleranfällig als omitempty, wenn die Absicht besteht, nullwerte auszulassen. Insbesondere im Gegensatz zu omitempty lässt omitzero nullwerte time.Time aus, was eine häufige Quelle von Problemen darstellt.
Wenn sowohl omitempty als auch omitzero angegeben sind, wird das Feld weggelassen, wenn der Wert leer oder null ist (oder beides zusammen).
UnmarshalTypeError.Field enthält jetzt integrierte Strukturen zur Bereitstellung detaillierter Fehlermeldungen.
go/types
Alle go/types-Datenstrukturen, die Paarmethoden wie Len() int und At(int) T offenlegen, verfügen nun ebenfalls über Methoden, die Iteratoren zurückgeben, was den folgenden Code vereinfacht:
params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }
Dafür:
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: zurückgegebenes Wert New, implementiert jetzt auch das Interface encoding.BinaryAppender
- hash/crc32: zurückgegebene Werte New und NewIEEE, implementieren jetzt ebenfalls das Interface encoding.BinaryAppender
- hash/crc64: zurückgegebenes Wert New, implementiert jetzt auch das Interface encoding.BinaryAppender
- hash/fnv: zurückgegebene Werte New32 New32a New64 New64a New128 und New128a, implementieren 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 in einem Go-Wörterbuch verwendet werden kann.
log/slog
Neu DiscardHandler ist ein Handler, der niemals aktiviert wird und immer seine Ausgabe verwirft.
Ebene und LevelVar implementiert jetzt das Interface encoding.TextAppender.
math/*
- math/big: Float, Int und Rat implementiert jetzt das Interface encoding.TextAppender.
- math/rand: Aufrufe der veralteten hochrangigen Funktion Seed haben keinen Effekt mehr. Um das alte Verhalten wiederherzustellen, kann man die Einstellung GODEBUG randseednop=0 verwenden. Mehr Kontext in Angeboten 67273.
- math/rand/v2: ChaCha8 und PCG implementiert jetzt das Interface encoding.BinaryAppender.
net
ListenCondig verwendet jetzt standardmäßig MPTCP auf Systemen, auf denen es unterstützt wird (derzeit nur Linux).
IP implementiert jetzt die Schnittstelle encoding.TextAppender.
net/http
Die Einschränkung hat sich geändert Transport auf empfangene Informationsantworten 1xx als Reaktion auf die Anfrage. Zuvor stoppte dies die Anfrage und gab einen Fehler zurück, nachdem mehr als 5 Antworten 1xx empfangen wurden. Nun wird ein Fehler nur zurückgegeben, wenn die gesamte Größe aller Antworten 1xx die Konfigurationseinstellung überschreitet Transport.MaxResponseHeaderBytes.
Darüber hinaus, wenn die Anfrage einen Hook zum Tracking hat net/http/httptrace.ClientTrace.Got1xxResponse, gibt es jetzt keine Begrenzung für die Gesamtzahl der Antworten 1xx. Der Hook Got1xxResponse kann einen Fehler zurückgeben, um die Anfrage zu stoppen.
Transport und Server haben jetzt ein HTTP2-Feld, das die Konfiguration der HTTP/2-Protokolleinstellungen ermöglicht.
Neue Felder Server.Protocols und Transport.Protocols bieten eine einfache Möglichkeit, zu konfigurieren, welche Protokolle der Server oder Client verwendet.
Server und Client können so konfiguriert werden, dass sie unverschlüsselte HTTP/2-Verbindungen unterstützen.
Wenn Server.Protocols enthält UnencrypterHTTP2, der Server akzeptiert HTTP/2-Verbindungen auf unverschlüsselten Ports. Der Server kann gleichzeitig HTTP/1 und unverschlüsseltes HTTP/2 auf demselben Port akzeptieren.
Wenn Transport.Protocols enthält UnencryptedHTTP2 und unterstützt kein HTTP1, der Transport nutzt unverschlüsseltes HTTP/2 für Adressen http://. Wenn der Transport konfiguriert ist, um sowohl HTTP/1 als auch unverschlüsseltes HTTP/2 gleichzeitig zu verwenden, wird HTTP/1 verwendet.
Die Unterstützung für unverschlüsseltes HTTP/2 verwendet „HTTP/2 mit Vorwissen“ (RFC 9113, Abschnitt 3.3). Der veraltete Header „Upgrade: h2c“ wird nicht unterstützt.
net/netip
Addr, AddrPort und Prefix implementieren nun die Schnittstellen encoding.BinaryAppender und encoding.TextAppender.
net/url
URL implementiert jetzt auch das Interface encoding.BinaryAppender.
os/user
In Windows Aktuell kann nun auf Windows Nano Server verwendet werden. Die Implementierung wurde aktualisiert, um die Verwendung von Funktionen aus der Bibliothek NetApi32 zu vermeiden, die im Nano Server nicht vorhanden ist.
In Windows Aktuell, Lookup und LookupId unterstützen nun die folgenden integrierten Dienstkonten des Benutzers:
- NT AUTHORITYSYSTEM
- NT AUTHORITYLOCAL SERVICE
- NT AUTHORITYNETWORK SERVICE
In Windows Aktuell wurde erheblich beschleunigt, wenn der aktuelle Benutzer mit einer langsamen Domain verbunden ist, was für viele Unternehmensbenutzer üblich ist. Die neue Implementierungsleistung liegt jetzt im Millisekundenbereich, im Vergleich zu der vorherigen Implementierung, die mehrere Sekunden oder sogar Minuten in Anspruch nehmen konnte, bis sie abgeschlossen war.
In Windows Aktuell gibt jetzt den Besitzerprozess des Benutzers zurück, wenn der aktuelle Thread sich als ein anderer Benutzer ausgibt. Früher gab es einen Fehler zurück.
regexp
Regexp implementiert jetzt die Schnittstelle encoding.TextAdapter.
Laufzeit
Die Funktion GOROOT wurde jetzt als veraltet erklärt. Im neuen Code sollte die Verwendung des Systempfades zur Bestimmung des 'go'-Binärprogramms bevorzugt werden, und 'go env GOROOT' sollte verwendet werden, um GOROOT zu bestimmen.
strings
Das Paket strings fügt einige Funktionen zur Arbeit mit Iteratoren hinzu:
- Lines gibt einen Iterator über durch neue Zeilen getrennte Strings in der Zeichenkette zurück.
- SplitSeq gibt einen Iterator über alle Teilstrings der Zeichenkette zurück, die durch den Separator getrennt sind.
- SplitAfterSeq gibt einen Iterator über Teilstrings der Zeichenkette zurück, die nach jedem Auftreten des Separators getrennt sind.
- FieldsSeq gibt einen Iterator über Teilstrings der Zeichenkette zurück, die um Sequenzen von Leerzeichen herum definiert sind.unicode.IsSpace
- FieldsFuncSeq gibt einen Iterator über Teilstrings der Zeichenkette zurück, die um Sequenzen von Unicode-Codepunkten herum definiert sind, die dem Prädikat entsprechen.
sync
Implementierung sync.Map wurde geändert, um die Leistung zu verbessern, insbesondere für Wörterbuchänderungen. Beispielsweise ist die Wahrscheinlichkeit eines Wettbewerbs bei nicht überlappenden Mengen in großen Wörterbüchern geringer, und es ist keine Anlaufzeit mehr erforderlich, um von einem Wörterbuch mit geringer Wettbewerbsintensität zu profitieren.
Wenn Sie auf Probleme stoßen, setzen Sie GOEXPERIMENT=nosynchashtriemap während des Builds, um zur alten Implementierung zurückzukehren, und bitte füllen Sie das Problemformular aus.
testing
Neue Methoden T.Context und B.Context geben den Kontext zurück, der nach Abschluss des Tests und vor der Ausführung von Testbereinigungsfunktionen zurückgesetzt wird.
Neue Methoden T.Chdir und B.Chdir könnten verwendet werden, um das Arbeitsverzeichnis während der Test- oder Benchmark-Ausführung zu ändern.
text/template
Vorlagen unterstützen jetzt range-over-func und range-over-int.
time
Zeit setzt jetzt die Schnittstellen um encoding.BinaryAppender und encoding.TextAppender.
Ports
Linux
Wie bereits erwähnt ankündigt in den Release-Notizen von Go 1.23 erfordert Go 1.24 einen Linux-Kernel der Version 3.2 oder höher.
Darwin
Go 1.24 ist die letzte Version, die auf macOS 11 Big Sur läuft. Go 1.25 wird macOS 12 Monterey oder höher erfordern.
WebAssembly
Die Compiler-Direktive go:wasmexport wurde zu Go-Anwendungen hinzugefügt, um Funktionen in den WebAssembly-Host zu exportieren.
Im WebAssembly System Interface Preview 1 (GOOS=wasip1 GOARCH=wasm) unterstützt Go 1.24 den Build von Go-Anwendungen als reactor/library durch die Angabe des Build-Flags -buildmode=c-shared.
Mehr Typen sind jetzt als Argument- oder Rückgabewerttypen für go:wasmimport-Funktionen erlaubt. Besonders bool, string, uintptr und Zeiger auf bestimmte Typen sind zulässig (Details sind zu finden in Dokumentation.), zusammen mit 32-Bit und 64-Bit Ganzzahlen und Fließkommazahlen sowie unsafe.Pointer, die bereits erlaubt sind. Diese Typen sind auch als Argument- oder Rückgabewerttypen für go:wasmexport-Funktionen zulässig.
Unterstützungsdateien für WebAssembly wurden von misc/wasm in lib/wasm verschoben.
Die ursprüngliche Speicherkapazität wurde erheblich reduziert, insbesondere für kleine WebAssembly-Anwendungen.
Windows
Der 32-Bit-Port windows/arm (GOOS=windows GOARCH=arm) wurde als fehlerhaft markiert. Details in #70705
Quelle: linux.org.ru
