Go komanda 19. augustā izlaida Go 1.27. Metodes tagad var deklarēt savus tipa parametrus, ko valoda neatļāva kopš ģenērisko tipu ieviešanas Go 1.18 laidienā 2022. gada martā. Starp abiem laidieniem pagāja četri gadi un pieci mēneši.
Tajā pašā laidienā ienāk jauna JSON pakete standartbibliotēkā, pēckvantu parakstu algoritms, UUID ģenerators un atmiņas piešķire, kas maziem objektiem strādā līdz 30 % ātrāk.
Kāpēc metodēm tipa parametru nebija
Sākotnējais tipa parametru projekts, uz kura balstās Go 1.18, ģenēriskās metodes apzināti izmeta. Iemesls bija saskarnes. Ja metodei drīkst būt savi tipa parametri, tad tādi vajadzīgi arī saskarnes metodēm, bet ģenērisku saskarnes metodi ir grūti īstenot: kompilatoram katrā izsaukuma vietā jāzina konkrētie tipi, ko dinamiska nosūtīšana neatklāj. Projekta autori aprakstīja arī otru izeju. Var pasludināt, ka parametrizētas metodes saskarnes neīsteno, taču tad zūd iemesls tām vispār būt, jo katru tādu metodi var uzrakstīt kā parastu ģenērisku funkciju.
2026. gada janvārī Roberts Grīzemers atvēra priekšlikumu #77273, kurā izvēlējās tieši šo otro izeju un pamatoja, kāpēc tā tomēr ir vērtīga. Priekšlikums maina skatu uz to, kas ir metode: funkcija, kas piesaistīta tipam un pieejama caur šā tipa vārdtelpu. Saskarņu īstenošana ir viens no šīs funkcijas lietojumiem.
Konkrētas metodes ir noderīgas pašas par sevi, arī tad, ja tās neīsteno saskarnes metodes.
Priekšlikumu pieņēma martā. Priekšlikuma apspriešanā parādījās arī cits motīvs: komentētāji atgādināja, ka izstrādātāju aptaujās ģenēriskās metodes nekad nav bijušas pirmajā vietā starp trūkstošajām iespējām, tāpēc laidiena galvenā iezīme daļai kopienas nāk kā negaidīta izvēle.
Ko drīkst rakstīt Go 1.27
Tipa parametrus drīkst pievienot metodēm uz konkrētiem tipiem. Saņēmēja bāzes tips pats var būt ģenērisks. Saskarnes metodēm tipa parametru joprojām nav un ģenēriska konkrēta metode saskarnes metodi neīsteno, jo saskarnē nevar būt metode ar atbilstošiem tipa parametriem.
Metodes izteiksmes un metodes vērtības uzvedas paredzami: ja metode ir ģenēriska, tāda ir arī iegūtā funkcija. Tipa argumentus var norādīt tieši vai atstāt kompilatoram izsecināšanai.
Standartbibliotēka jauno iespēju izmanto uzreiz. Paketē math/rand/v2 nejaušam skaitlim diapazonā tagad ir metode (*Rand) N[Int intType](Int) Int. Agrāk tāds pats nosaukums pastāvēja tikai kā pakotnes līmeņa funkcija. Šī viena rinda iepriekš valodā nebija izsakāma.
Valodā ir vēl divas izmaiņas. Struktūru literāļos atslēga tagad var būt jebkurs derīgs lauka selektors. Agrāk tur bija pieļaujams tikai augšējā līmeņa lauka nosaukums, tāpēc iegulta lauka aizpildīšana prasīja atsevišķu izteiksmi. Funkciju tipu izsecināšana strādā visos piešķires un konversijas kontekstos, agrāk tā aptvēra šaurāku sarakstu.
JSON standartbibliotēkā pārrakstīts otrreiz
Go 1.27 pievieno encoding/json/v2 un zemāka līmeņa encoding/json/jsontext, kas strādā ar JSON marķieriem un vērtībām. Funkcijas Marshal un Unmarshal tagad pieņem mainīga garuma Options sarakstu, tāpēc uzvedību var mainīt katrā izsaukuma vietā. Agrāk daļa no tās bija ierakstīta struktūru tagos.
Noklusējumi ir stingrāki. Jaunā pakete atsaka nederīgu UTF-8 un dublētas objekta atslēgas, ko vecā versija klusējot pieņēma. Serializēšanas ātrums ir līdzīgs iepriekšējam, deserializēšana ir jūtami ātrāka. Vecā encoding/json saglabā savu saskarni, bet iekšēji tagad izmanto v2 kodu, tāpēc esošs kods strādā tālāk. Ja pāreja kaut ko salauž, jauno dzini var izslēgt ar GOEXPERIMENT=nojsonv2, kuru komanda plāno kādā nākamajā laidienā izņemt.
Piešķire, noplūdes profils, pēckvantu paraksti
Izpildlaiks maziem objektiem izmanto pēc izmēra specializētas piešķires funkcijas. Objektiem zem 80 baitiem tas dod līdz 30 % ātrāku piešķiri. Programmās, kur piešķires dominē, kopējais ieguvums ir apmēram 1 %. Cena ir aptuveni 60 KB binārā faila pieauguma. Izslēgšanas karogs GOEXPERIMENT=nosizespecializedmalloc pastāv, taču to gaidāms izņemt jau Go 1.28.
Gorutīnu noplūdes profils pārgāja no eksperimenta uz pastāvīgu iespēju. Paketē runtime/pprof parādījās profila veids goroutineleak, kas pieejams arī kā /debug/pprof/goroutineleak galapunkts. Tas meklē gorutīnas, kas bloķējušās uz kanāliem vai slēdzenēm, kurus vairs neviens nesasniedz, izmantojot atkritumu savācēja sasniedzamības analīzi. Noplūdes caur globāliem mainīgajiem šī metode neatrod. Profilu izstrādāja Vlads Saioks no Uber.
Kriptogrāfijā ienāca crypto/mldsa ar FIPS 204 parakstu shēmu ML-DSA. To saprot arī crypto/x509 un crypto/tls, kur TLS 1.3 tagad pieņem parakstu shēmas MLDSA44, MLDSA65 un MLDSA87. Atslēgu apmaiņai pievienots MLKEM1024. Standartbibliotēkā beidzot ir uuid pakete UUID ģenerēšanai un parsēšanai, kas līdz šim gandrīz katrā projektā nozīmēja ārēju atkarību.
SIMD atbalsts sadalījās divās daļās. Eksperimentālā simd pakete piedāvā pārnesamu, no vektora garuma neatkarīgu saskarni ar tipiem Int8s un Float32s. To ieslēdz ar karogu GOEXPERIMENT=simd. Arhitektūrai piesaistītā simd/archsimd saņēma pārstrādātu amd64 saskarni, kā arī 128 bitu atbalstu arm64 Neon un WebAssembly. Unicode tabulas pārgāja no 15. versijas uz 17.
Kas no laidiena izņemts
Go rīki vairs neievelk moduļus no Bazaar repozitorijiem. GODEBUG iestatījums asynctimerchan pazuda pavisam, tāpēc time paketes kanāli tagad vienmēr ir nebuferēti. Tāpat aizgāja gotypesalias un pieci TLS savietojamības slēdži, tostarp tls3des un tls10server. macOS jaunajai versijai vajag vismaz macOS 13 Ventura.
Divas izmaiņas var pārsteigt CI skriptos. Komanda go test tagad pēc noklusējuma palaiž stdversion pārbaudi, kas ziņo par standartbibliotēkas simboliem, kuri ir jaunāki par moduļa mērķa versiju. Un go tool trace -http=:6060 vairs neklausās uz visām adresēm, bet tikai uz localhost, tāpat kā pprof. Attālinātai piekļuvei jāraksta -http=0.0.0.0:6060. Big-endian ppc64 uz Linux pārgāja uz ELFv2 ABI, kas prasa kodolu no 3.13 versijas un pretī dod cgo, PIE un ārējo linkēšanu. Pilnu sarakstu satur laidiena piezīmes, bet īsāko pārskatu Go bloga ieraksts.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.