programmatūra · 5 min · 21.07.2026

Go 1.27 ļauj metodei deklarēt savus tipa parametrus — ģeneriskās metodes pēc četriem gadiem

Go 1.27, ko Google plāno izlaist augustā, ļauj metodei deklarēt pašai savus tipa parametrus. Tas nozīmē, ka ģenerisku loģiku beidzot var pierakstīt konkrēta tipa iekšienē, nevis kā atsevišķu paketes līmeņa funkciju. Šo iespēju Go lietotāji lūdza kopš brīža, kad ģeneriskie tipi 2022. gada martā ienāca Go 1.18 — tātad četrus gadus.

Līdz šim metode Go valodā nedrīkstēja pievienot jaunus tipa parametrus. Ja tev vajadzēja ģenerisku darbību, kas piesaistīta kādai struktūrai, nācās rakstīt brīvu funkciju ar visas paketes redzamību. Oficiālajās 1.27 piezīmēs teikts vienkārši: metodes deklarācija tagad var deklarēt pati savus tipa parametrus. To pašu apstiprina VersionLog versiju pārskats, kur ģeneriskās metodes minētas kā laidiena galvenā izmaiņa.

Ko tas maina kodā

Praksē tas atrisina veselu rindu vietu, kur agrāk kods izskatījās neveikls. Ņem kolekcijas tipu, kuram gribi metodi Map, kas atgriež citu elementa tipu. Vecajā Go tā nebija iespējama kā metode — elementa tips būtu jauns tipa parametrs, un to metodei nedrīkstēja pievienot. Risinājums bija paketes funkcija Map(s Set[T], f func(T) U) Set[U], ko izsauc ar visu argumentu kopu.

Ar 1.27 to var uzrakstīt tā, kā daudzi to gaidīja: func (s Set[T]) Map[U any](f func(T) U) Set[U]. Metode dzīvo tipa namtelpā, izsaukums lasās kā s.Map(f), un elementa pārveides tips vairs nav jāliek atsevišķā funkcijā. Tā ir maza sintakses izmaiņa ar plašām sekām bibliotēku autoriem, kuri būvē kolekcijas, iteratorus un funkcionāla stila palīgrīkus.

Kopā ar to Go 1.27 vispārina funkciju tipa izsecināšanu. Tagad kompilators pats nosaka tipa argumentus vairākos jaunos gadījumos: kad ģenerisku funkciju piešķir mainīgajam vai pārveido par atbilstoša tipa funkciju. Agrāk tas droši strādāja galvenokārt tiešos izsaukumos. Struktūru literāļos par atslēgu drīkst būt jebkurš derīgs lauka atlasītājs, ne tikai augšējā līmeņa lauka nosaukums.

encoding/json tiek pārbūvēts

Otra liela izmaiņa skar JSON. Go 1.27 ievieš pakotni encoding/json/v2 un zemāka līmeņa encoding/json/jsontext ar Encoder, Decoder, Token un Value tipiem. Vecā encoding/json nekur nepazūd — tā tagad iekšēji strādā uz v2 dzini.

Jaunā versija maina noklusējumus uz stingrākiem. Tā noraida nederīgu UTF-8 un dublētus objekta atslēgu nosaukumus, ko vecā pakotne klusi pieņēma. Marshal un Unmarshal funkcijas tagad pieņem mainīgu skaitu Options argumentu, un atkodēšana ir jūtami ātrāka. Ja stingrie noklusējumi lauž tavu kodu, v2 var izslēgt ar GOEXPERIMENT=nojsonv2.

Dublētu atslēgu noraidīšana ir tā izmaiņa, kas visdrīzāk uzrādīsies esošajos projektos — daudzi API klusi paļāvās uz to, ka pēdējā atslēga uzvar.

Ātrāka atmiņa un noplūžu detektors

Runtime līmenī 1.27 mazina mazu atmiņas piešķīrumu cenu. Kompilators ģenerē izmēram specializētas piešķiršanas rutīnas objektiem, kas mazāki par 80 baitiem, un tas samazina piešķiršanas izmaksas līdz 30 %. Cena par to ir aptuveni 60 KB lielāks binārais fails. Uzvedību var atgriezt ar GOEXPERIMENT=nosizespecializedmalloc.

Goroutine noplūžu profilēšana pāriet no eksperimentālas uz vispārīgi pieejamu. Jaunais goroutineleak profila tips runtime/pprof pakotnē un galapunkts /debug/pprof/goroutineleak atrod goroutines, kas iestrēgušas uz sinhronizācijas primitīviem un ko nekas vairs nevar atbloķēt. Šādas noplūdes ilgi bija viena no grūtāk pamanāmajām kļūdām ilgstoši strādājošos Go serveros.

Pēckvantu paraksti un jauna uuid pakotne

Kriptogrāfijā Go 1.27 pievieno pakotni crypto/mldsa, kas ievieš FIPS 204 standarta ML-DSA pēckvantu parakstus. Pakotne crypto/x509 saprot ML-DSA atslēgas un parakstus, bet crypto/tls atbalsta ML-DSA parakstus TLS 1.3 ar jaunām MLDSA44, MLDSA65 un MLDSA87 vērtībām. Klāt nāk arī MLKEM1024 atslēgu apmaiņa.

Standarta bibliotēka beidzot dabū iebūvētu uuid pakotni UUID ģenerēšanai un parsēšanai — līdz šim gandrīz katrs projekts tam vilka klāt trešās puses bibliotēku. Rīku pusē compile, link, asm, cgo, cover un pack tagad prot lasīt atbildes failus ar @file sintaksi, kas saderīga ar GCC formātu, bet go test pēc noklusējuma palaiž stdversion vet pārbaudi.

Jaunākais pirmslaidiena būvējums, 1.27rc2, iznāca 7. jūlijā. Stabilā versija gaidāma augustā, un līdz tam brīdim visi šie punkti oficiālajā dokumentācijā ir atzīmēti kā vēl darbā esoši.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie