Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Programování

Go 1.27 přidalo generické metody, které stránka častých dotazů jazyka dosud odmítala

Go 1.27 vyšlo 19. srpna 2026 a poprvé dovoluje, aby si metoda deklarovala vlastní typové parametry. Odpovědi na časté dotazy na go.dev přitom dodnes vysvětlují, proč jazyk generické metody mít nebude. Zlom přinesl návrh, který se vzdal jejich vazby na rozhraní.

· aktualizováno 1. 9. 2026 · 183 zhlédnutí

Dva tužkou nakreslení maskoti jazyka Go, jeden drží tužku, druhý hasák, mezi nimi stojí malý robot
Maskoti jazyka Go od výtvarnice Renée French. Foto: Renée French, Wikimedia Commons (CC BY 3.0)

Generika dostal jazyk Go ve verzi 1.18 v březnu 2022, ale jen napůl. Vlastní typové parametry směla vyhlásit funkce nebo typ, metoda ne; ta si mohla vzít nanejvýš parametry svého příjemce. Kdo potřeboval metodu pracující s libovolným celočíselným typem, napsal ji zvlášť pro každý z nich, nebo místo metody sáhl po samostatné generické funkci. Verze 1.27, vydaná 19. srpna 2026 půl roku po 1.26, to mění.

Metoda si smí říct o vlastní typ

Deklarace metody teď přijímá typové parametry stejně jako deklarace funkce. Ukázkou je standardní balíček math/rand/v2, kde tři metody nahradila jedna:

// do Go 1.26
func (r *Rand) Int32N(n int32) int32
func (r *Rand) Int64N(n int64) int64
func (r *Rand) IntN(n int) int

// Go 1.27
func (r *Rand) N[Int intType](n Int) Int

Nejde jen o počet řádků. Metoda patří do jmenného prostoru svého typu, takže se řetězí zleva doprava jako x.a().b().c(); u funkcí se totéž zapíše c(b(a(x))) a čte se zevnitř ven. Autor návrhu Robert Griesemer tenhle zápis uvádí jako jeden ze dvou důvodů, proč o generické metody uživatelé dlouho žádali. Druhým je prosté třídění kódu podle typu, ke kterému patří.

Odpovědi na časté dotazy pořád tvrdí opak

Ve stránce častých dotazů na go.dev stálo 20. srpna 2026 dál, že tvůrci nepředpokládají, že by Go generické metody kdy přidalo (přeloženo z angličtiny). Následuje vysvětlení, které je samo o sobě zajímavé.

Potíž byla v rozhraních. Go po typu nechce, aby deklaroval, která rozhraní splňuje. Návrh tomu říká dynamická vlastnost: shoda se ukáže i za běhu, třeba při typové aserci. Kdyby metoda s typovým parametrem směla splnit metodu rozhraní, musel by překladač předem připravit kód pro nekonečně mnoho možných instancí. Dokumentace probírá čtyři východiska a všechna zamítá. To čtvrté zní, že generické metody nesmí splňovat rozhraní vůbec, a stránka ho označuje za návrhově nepřijatelné.

Přijatý návrh #77273 vzal právě tuhle čtvrtou možnost. Griesemer v něm nemění implementaci, mění pohled: metoda není jen nástroj k naplnění rozhraní, je to funkce navěšená na typ. Metoda rozhraní typové parametry syntakticky mít nesmí, takže generická konkrétní metoda proti ní nemá co srovnávat – a otázka nekonečně mnoha instancí odpadá sama. Návrh nese značku Proposal-Accepted a milník Go1.27. Starší žádost o totéž z října 2021 měla podle jeho textu přes devět set kladných reakcí.

Co generická metoda neumí

Omezení jsou dvě a návrh je píše natvrdo. Rozhraní u svých metod typové parametry nadále mít nemůže, takže generickou metodou se rozhraní nesplní. A přes balíček reflect se ke generické metodě nedostanete – ze stejného důvodu, z jakého se přes něj nedá sáhnout na neinstanciovanou generickou funkci.

Struktury a odvozování typů

Jazyk se mění ještě na dvou dalších místech. Klíčem v literálu struktury smí být libovolný platný selektor pole, ne jen jméno pole nejvyšší úrovně. Pole vnořené nebo vložené struktury se tak nastaví rovnou:

type Habitat struct {
	Burrow string
}

type Gopher struct {
	Name string
	Habitat // vložená struktura
}

g := Gopher{
	Name:   "Gopher",
	Burrow: "Burrow #42",
}

Druhá změna se týká odvozování typu funkce. Nově platí ve všech situacích, kdy se generická funkce přiřadí do proměnné odpovídajícího funkčního typu nebo se na něj převede.

JSON, postkvantové podpisy a UUID

Ve standardní knihovně přibyl encoding/json/v2, velká revize práce s JSONem, a k němu encoding/json/jsontext na nižší, syntaktickou vrstvu. Dvojka má přísnější výchozí nastavení: odmítne neplatné UTF-8 v řetězcích a dvakrát použité jméno v jednom objektu. Starý balíček encoding/json teď stojí na implementaci dvojky, chování si podle poznámek k vydání zachoval a liší se jen znění chybových hlášek. Čtení JSONu je citelně rychlejší, zápis zůstal zhruba na stejné úrovni. Komu nová implementace něco rozbije, vrátí se k původní přes GOEXPERIMENT=nojsonv2.

Balíček crypto/mldsa přináší postkvantové podpisové schéma ML-DSA podle normy FIPS 204. Umí ho i crypto/x509crypto/tls, kde v TLS 1.3 přibyly hodnoty MLDSA44, MLDSA65 a MLDSA87. Nový je taky balíček uuid na tvorbu a čtení identifikátorů UUID a experimentální simd pro vektorové instrukce. Jeho architekturní část simd/archsimd podle Phoronixu přepracovala rozhraní pro AMD64 a přidala 128bitové Arm Neon a WebAssembly.

Alokace, zablokované gorutiny a dvě odstraněné věci

Překladač nově volá alokační rutiny specializované podle velikosti. U objektů pod 80 bajty to zlevňuje alokaci až o 30 %; u programů, které hodně alokují, čeká tým jazyka celkové zrychlení kolem 1 %. Binárka se tím zvětší asi o 60 kB bez ohledu na to, co dělá. Vypnout to jde přes GOEXPERIMENT=nosizespecializedmalloc, jenže jen dočasně – vypínač má v Go 1.28 zmizet.

Profil goroutineleak, v Go 1.26 ještě experiment, je teď běžně dostupný v runtime/pprof i jako koncový bod /debug/pprof/goroutineleak. Hledá gorutiny zablokované na kanálu nebo zámku, který už nemá jak je pustit dál: běhové prostředí se k tomu opře o garbage collector a ptá se, jestli je ta synchronizační primitiva vůbec dosažitelná z něčeho běžícího. Úplný nález to není. Když je ta primitiva dosažitelná z globální proměnné nebo z lokálních proměnných běžících gorutin, únik zůstane neodhalený. Práci přispěl Vlad Saioc z Uberu.

Dvě věci naopak ubyly. Příkaz go už nepodporuje verzovací systém bzr, takže moduly hostované na bzr serverech si sám nestáhne. A nastavení asynctimerchan, přidané v Go 1.23, zmizelo natrvalo: kanály z balíčku time jsou od 1.27 vždy nebufferované, ať si do GODEBUG napíšete cokoli.

Co zbývá

Stránka častých dotazů zatím pořád vysvětluje, proč generické metody nebudou. Tým jazyka slíbil k tématům z 1.27 v následujících týdnech samostatné texty, takže na podrobnosti o JSONu i o vektorových instrukcích ještě dojde.

Zdroje: Go 1.27 is releasedGo 1.27 Release Notes na go.dev, návrh golang/go#77273, Go FAQ, Phoronix.

Programování

programovací jazyky Go generika standardní knihovna postkvantová kryptografie

← zpět na výpis