Skip to content
Tech AI Wire

Go 1.27 bringt generische Methoden und ein schnelleres encoding/json

Go 1.27 erschien am 19. August 2026 mit generischen Methoden, einer v2-Engine unter encoding/json, Goroutine-Leak-Profilen und post-quantensicheren Signaturen.

Von Tech AI Wire Team

4 Min. Lesezeit

XLinkedIn
A terminal showing go version reporting go1.27 on darwin/arm64, beside a Go method declaration that carries its own type parameter.

Go 1.27 erschien am 19. August 2026 und ändert die Sprache selbst. Methoden dürfen jetzt eigene Typparameter deklarieren, was Go seit der Einführung von Generics verweigert hatte. Nicholas Husin kündigte das Release im Go-Blog für das Go-Team an.

Zwei andere Änderungen erreichen mehr Programme als die Spracharbeit. Das Standard-JSON-Paket läuft jetzt auf einer neuen Engine, und die Laufzeit kann sagen, welche Goroutinen geleckt sind.

Generische Methoden und ihre eine Grenze

Vor diesem Release konnte ein Typ generisch sein, seine Methoden aber keine eigenen Typparameter ergänzen. Autoren schrieben stattdessen je eine Methode pro konkretem Typ.

Die Release Notes verweisen auf math/rand/v2.Rand als Beispiel. Die Methode lautet nun (*Rand) N[Int intType](Int) Int. Eine Methode deckt jeden Integer-Typ ab.

Es gibt eine feste Einschränkung. Methoden von Interfaces dürfen keine Typparameter deklarieren, also kann eine generische Methode keine Interface-Methode implementieren. Diese Grenze ist beabsichtigt und keine vorübergehende Lücke.

Zwei kleinere Sprachänderungen kommen dazu. Ein Schlüssel in einem Struct-Literal "may now be any valid field selector for the struct type", womit sich verschachtelte und eingebettete Felder direkt setzen lassen. Und die Typinferenz für Funktionen "has been generalized to apply in all assignment contexts", einschließlich zusammengesetzter Literale, Konvertierungen und Kanal-Sends.

encoding/json läuft jetzt auf v2

Das Paket encoding/json wird jetzt von einer v2-Implementierung getragen. Die v1-API bleibt, und die Release Notes sagen ausdrücklich, dass sie nicht veraltet ist. Eine Migration ist nicht nötig.

Die Voreinstellungen wurden strenger, und genau hier kann funktionierender Code brechen. Die v2-Engine weist ungültiges UTF-8 in JSON-Strings zurück. Sie weist außerdem doppelte Namen in einem JSON-Objekt zurück. Beides ging vorher durch.

ÄnderungWirkung
Ungültiges UTF-8 in StringsWird jetzt abgelehnt
Doppelte ObjektschlüsselWerden jetzt abgelehnt
Unmarshal-TempoDeutlich schneller
Marshal-TempoEtwa gleich
Tags format und unknownIn v2 entfernt
Tag-Option inlineUmbenannt in embed

Bricht etwas, stellt GOEXPERIMENT=nojsonv2 die alte Implementierung beim Build wieder her. Betrachten Sie das als Frist, nicht als Lösung. Laut Release Notes soll dieser Ausstieg in einem künftigen Release entfallen.

Zwei neue Pakete kommen mit: encoding/json/v2, das variadische Optionen nimmt, und encoding/json/jsontext für die Arbeit auf Token-Ebene.

Leak-Profile, Allokation und post-quantensichere Signaturen

Das Goroutine-Leak-Profil ist jetzt allgemein verfügbar in runtime/pprof, nachdem es in Go 1.26 experimentell war. Eine geleckte Goroutine ist "a goroutine blocked on some concurrency primitive (channels, sync.Mutex, sync.Cond, etc) that cannot possibly become unblocked".

Die Laufzeit findet sie über den Garbage Collector. Wartet eine blockierte Goroutine auf etwas, das keine lauffähige Goroutine mehr erreichen kann, wacht sie nie wieder auf. Abrufbar unter /debug/pprof/goroutineleak. Es gibt einen benannten blinden Fleck: Lecks an Primitiven, die über globale Variablen erreichbar sind, können übersehen werden.

Allokation wurde billiger. Der Compiler ruft jetzt größenspezialisierte Allokationsroutinen auf und senkt die Kosten für Allokationen unter 80 Byte um bis zu 30%. Die Release Notes beziffern den Gewinn fürs ganze Programm auf rund 1% bei allokationslastigem Code, und die Binärdatei wächst um etwa 60 KB.

Für Sicherheitsteams implementiert crypto/mldsa ML-DSA, das post-quantensichere Signaturverfahren aus FIPS 204. TLS 1.3 erhält die Signaturverfahren MLDSA44, MLDSA65 und MLDSA87, und x509 verarbeitet die Schlüssel.

Was das für Entwickler bedeutet

Lesen Sie vor dem Upgrade die Entfernungen, denn dort steckt der Bruch. Go 1.27 verlangt jetzt macOS 13 Ventura oder neuer. Es lässt die Unterstützung für das Versionskontrollsystem bzr fallen, sodass dort gehostete Module nicht mehr geladen werden können.

Mehrere GODEBUG-Notausgänge sind weg, und eine davon ändert das Verhalten. Mit dem Wegfall von asynctimerchan sind Kanäle aus dem Paket time jetzt immer ungepuffert. Wer Code um das gepufferte Verhalten herum geschrieben hat, arbeitet nun unter einem anderen Vertrag.

Die JSON-Änderung verdient einen Staging-Lauf statt einer Lektüre. Strengeres Parsen scheitert an Daten, die Sie heute annehmen, und doppelte Schlüssel kommen typischerweise aus fremden Systemen, nicht aus Ihren Tests. Richten Sie den neuen Build auf echte Produktionsdaten, bevor Sie ausliefern.

Schalten Sie das Leak-Profil ein, auch wenn nichts auffällt. Es kostet nichts, es ist jetzt stabil, und eine dauerhaft blockierte Goroutine hält ihren Stack und alles, was der Stack referenziert. Diese Fehlerklasse zeigt sich selten als Fehler, sondern nur als Speicher, der nie zurückkommt.

Eine letzte Prüfung für alle, die Trickreiches mit Funktionswerten tun. Der Compiler erzeugt jetzt einfachere Namen für Closures, sodass Tests auf Symbolnamen angepasst werden müssen. Code, der Funktionszeiger auf Gleichheit vergleicht, war immer falsch, und dieses Release legt das häufiger offen.

Quellen

  1. Go 1.27 is released - The Go Blog
  2. Go 1.27 Release Notes - go.dev

Ähnliche Artikel