Vydání Go 1.22

Byl vydán jazyk programování Go 1.22, který se vyvíjí společností Google za účasti komunity jako hybridní řešení, spojující vysoký výkon kompilovaných jazyků s výhodami skriptovacích jazyků, jako je snadnost psaní kódu, rychlost vývoje a ochrana proti chybám. Kód projektu je šířen pod licencí BSD.

Syntaxe Go vychází z běžných prvků jazyka C s několika výpůjčkami z jazyka Oberon. Jazyk je poměrně stručný, ale přitom je kód snadno čitelný a srozumitelný. Kód v jazyce Go se kompiluje do samostatných binárních spustitelných souborů, které jsou prováděny nativně, bez použití virtuálního stroje (moduly profilování, ladění a další subsystémy odhalování problémů se integrují jako runtime komponenty), což umožňuje dosáhnout výkonu srovnatelného s programy v jazyce C.

Projekt byl od počátku vyvíjen s ohledem na vícevláknové programování a efektivní práci na vícejádrových systémech, a to včetně poskytování nástrojů na úrovni operátorů pro organizaci paralelního výpočtu a komunikaci mezi paralelně prováděnými metodami. Jazyk také poskytuje integrované prostředky ochrany proti překročení povolených oblastí přidělených bloků paměti a umožňuje použití garbage collectoru.

Mezi změnami v novém vydání:

  • Do cyklů 'for' byla přidána podpora definice rozsahů celých čísel, například pro procházení hodnot od 0 do 9 lze nyní použít cyklus 'for i := range 10 {…}'.
  • Do cyklů 'for' byla přidána experimentální (GOEXPERIMENT=rangefunc) podpora funkcí definice rozsahu, která umožňuje uvést funkci jako iterátor. Například 'for i, x := range slices.Backward(s) {…}'
  • Byl vyřešen dlouholetý problém s cykly 'for', který při vyvolání goroutine vedl k možnosti sdílení proměnných cyklu v různých iteracích. Například kód values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } nyní vrátí 'a', 'b' a 'c', a ne pouze 'c', jak to bylo dříve.
  • Byla provedena optimalizace práce s pamětí v runtime, která vedla k zvýšení výkonu o 1-3 % a snížení spotřeby paměti v většině aplikací o 1 %.
  • Pokračuje se na implementaci optimalizací v kompilátoru založených na výsledcích profilování kódu (PGO — Optimalizace řízená profilováním), které umožňují zohlednit vlastnosti určené během běhu programu. V nové verzi kompilátoru byly zapojeny prostředky devirtualizace pro nahrazení nepřímých volání různých metod prováděním rozšířených inline bloků.
  • Při zapnutí PGO umožnilo přidané změny zvýšit výkon většiny programů o 2-14%.
  • Do kompilátoru byla přidána experimentální (GOEXPERIMENT=newinliner) vylepšená implementace mechanismu inline volání, využívající heuristiky k rozdělení důležitých a vedlejších operací.
  • Do standardní knihovny byl přidán balíček „math/rand/v2“, který nabízí komplexnější API a využívá rychlejší algoritmy pro generování pseudonáhodných čísel.
  • Do balíčku net/http.ServeMux byla přidána možnost uvádět metody a masky v šablonách, například šablona „GET /static/{id}/“ bude použita pro požadavky s HTTP metodou „GET“ a zachová hodnotu druhého segmentu požadované cesty jako identifikátor „id“.
  • Do balíčku database/sql byla přidána podpora typu Null[T], který umožňuje skenování sloupců, které mohou mít hodnotu NULL. Do balíčku slices byla přidána funkce Concat pro sloučení několika řezů jakéhokoli typu.
  • V příkazech pro práci s pracovními prostory (kolekcemi modulů) byla poskytnuta možnost využití adresáře „vendor“, který obsahuje závislosti pro obsah pracovního prostoru. Adresář je vytvořen při provádění příkazu „go work vendor“ a používá se v sestavovacích příkazech při nastavení možnosti "-mod=vendor" (zahrnuje výchozí nastavení při existenci adresáře vendor).

Změny v chování utilit.

  • go get již není podporováno mimo modul v zastaralém režimu GOPATH (tj. s GO111MODULE=off). Jiné sestavovací příkazy, jako go build a go test, budou i nadále fungovat pro zastaralé GOPATH programy po neomezenou dobu.
  • go mod init již se nesnaží importovat požadavky na moduly z konfiguračních souborů pro jiné nástroje dodavatelů (např. Gopkg.lock).
  • go test -cover nyní tiskne souhrnné údaje o pokrytí pro pokrývané balíčky, které nemají vlastní testovací soubory. Před Go 1.22 by go test -cover pro takový balíček hlásil? mymod/mypack [no test files]

    a nyní s Go 1.22 jsou funkce v balíčku považovány za nepokryté: mymod/mypack coverage: 0.0% of statements Všimněte si, že pokud balíček vůbec neobsahuje vykonávatelný kód, nemůžeme hlásit významné procento pokrytí; pro takové balíčky bude go test nadále hlásit, že neobsahují testovací soubory.

  • Webové rozhraní nástroje trace bylo mírně aktualizováno v rámci práce na podpoře nového trasovače, byla vyřešena některá problémy a byla zlepšena čitelnost různých stránek. Webové rozhraní nyní podporuje prozkoumávání tras v pohledu zaměřeném na proud. Prohlížeč tras nyní také zobrazuje celkovou délku všech systémových volání. Tato vylepšení se vztahují pouze na prohlížení tras vytvořených programy vytvořenými na Go 1.22 nebo novějším. V budoucím vydání budou některá z těchto vylepšení aplikována na trasování vytvářené starší verzí Go.
  • Prostředí runtime nyní uchovává metadata o sběru odpadu na základě typů blíže ke každému objektu haldy. Tato změna také snižuje náklady na paměť většiny programů Go přibližně o 1 % díky deduplikaci nadbytečných metadat. U některých programů může být zlepšení menší, protože tato změna koriguje hranice velikosti třídiče paměti, takže některé objekty mohou být přesunuty do vyšší velikostní třídy. Důsledkem této změny je, že adresy některých objektů, které byly dříve vždy zarovnány na hranici 16 bytů (nebo vyšší), budou nyní zarovnány pouze na hranici 8 bytů. Některé programy, které používají assemblerové instrukce, vyžadující, aby adresy paměti byly zarovnány na velikost více než 8 bytů a spoléhají na předchozí chování zarovnání třídiče paměti, mohou selhat, ale očekáváme, že takové programy budou vzácné. Takové programy mohou být vytvořeny s GOEXPERIMENT=noallocheaders s možností návratu ke starému modelu metadat a obnovení předchozího chování zarovnání, ale vlastníci balíků by měli aktualizovat svůj assemblerový kód, aby se vyhnuli předpokladu o zarovnání, protože tato obcházející cesta bude v budoucí verzi odstraněna.
  • Jak bylo zmíněno v poznámkách k vydání Go 1.20, Go 1.22 nyní vyžaduje finální verzi Go 1.20 nebo novější pro počáteční sestavení. Očekáváme, že Go 1.24 vyžádá finální verzi Go 1.22 nebo novější pro počáteční sestavení.
    Originál (go.dev)

Zdroj: linux.org.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster