Megjelent a Go 1.22 programozási nyelv új változata, amelyet a Google fejleszt közösségi részvétellel, mint hibrid megoldás, amely ötvözi a lefordított nyelvek magas teljesítményét a szkriptnyelvek olyan előnyeivel, mint a kód könnyű írása, a gyors fejlesztés és a hibák elleni védelem. A projekt kódja BSD licenc alatt terjed.
A Go szintaxisa a C nyelv ismerős elemein alapul, néhány Oberon nyelvből átvett elemmel. A nyelv elég tömör, de a kód könnyen olvasható és érthető. A Go nyelvű kód különálló bináris végrehajtható fájlokká fordul, amelyeket natívan futtatnak, virtuális gép használata nélkül (profilozási, hibakeresési és egyéb problémakezelő alrendszerek futási komponensként integrálva vannak), így teljesítménye a C nyelvű programokéval vetekszik.
A projekt kezdetben a több szálú programozásra és a többmagos rendszereken való hatékony működésre összpontosított, beleértve olyan operátorszinten realitásokat, amelyek segítik a párhuzamos számítások és a párhuzamosan futó módszerek közötti interakciók megszervezését. A nyelv beépített védelmi eszközöket is biztosít a memóriaterületek túllépése ellen, egyúttal lehetőséget ad a szemétgyűjtő használatára is.
A legújabb verzióban bekövetkezett változások:
- A „for” ciklusokhoz hozzáadódott a teljes számok intervallumainak meghatározására vonatkozó támogatás, például a 0-tól 9-ig terjedő értékek átjárásához most a „for i := range 10 {…}” ciklus használható.
- A „for” ciklusokhoz hozzáadódott egy kísérleti (GOEXPERIMENT=rangefunc) intervallumképző funkciók támogatása, amely lehetővé teszi, hogy funkciót adjunk meg iterátorként. Például: „for i, x := range slices.Backward(s) {…}”.
- Megoldották a régóta fennálló problémát a „for” ciklusokkal, amely a goroutine-ok (könnyű szálak) hívásakor a ciklusváltozók egyes iterációk közötti megosztásához vezetett. Például a kód values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } most már az „a”, „b” és „c” értékeket fogja kiírni, nem csak a „c”-t, mint korábban.
- Optimalizálták a memóriakezelést a runtime-ban, ami 1-3%-os teljesítménynövekedést és a memóriafogyasztás 1%-os csökkenését eredményezte a legtöbb alkalmazás esetében.
- Folytatódik a fordítóban a kódprofilozás (PGO - Profile-guided optimization) alapján végzett optimalizálások alkalmazása, amelyek figyelembe veszik a program futása közben meghatározott sajátosságokat. Az új verzióban a fordítóban a virtuálás csökkentésére szolgáló eszközök kerültek bevezetésre, amelyek a különböző metódusok közvetett hívásait kibővített inline-blokkok végrehajtására cserélik.
- A PGO engedélyezésével a hozzáadott módosítás lehetővé tette a legtöbb program teljesítményének 2-14%-kal történő növelését.
- A fordítóba egy kísérleti (GOEXPERIMENT=newinliner) továbbfejlesztett megvalósítás került bevezetésre a hívások kibővítésének (inlining) mechanizmusához, amely heurisztikát alkalmaz a fontos és másodlagos műveletek elválasztására.
- A standard könyvtárba hozzá lett adva a „math/rand/v2” csomag, amely egy átfogóbb API-t kínál, és gyorsabb ál-random számgeneráló algoritmusokat alkalmaz.
- A net/http.ServeMux csomaghoz lehetőség került hozzáadásra az HTTP-módszerek és minták megadására, például a „GET /static/{id}/” minta alkalmazásra kerül a GET HTTP-módszert használó kérések esetén, és a kért út második szegmensében található értéket az „id” azonosítóban tárolja.
- A database/sql csomaghoz hozzá lett adva a Null[T] típus támogatása, amely lehetővé teszi a NULL értéket elfogadó oszlopok beolvasását. A slices csomaghoz hozzáadódott a Concat függvény a különböző típusú szeletek összefűzésére.
- A munkaterületekkel (modulkészletekkel) való munkára használható parancsokhoz lehetőség került biztosítani egy „vendor” könyvtár használatára, amely a munkaterület tartalmához tartozó függőségeket tartalmaz. A könyvtár a „go work vendor” parancs végrehajtásakor jön létre, és az építési parancsokban használják a "-mod=vendor" opció megadásakor (automatikusan be van kapcsolva, ha létezik a vendor könyvtár).
Változások a segédprogramok viselkedésében.
- A go get már nem támogatott a modulon kívül, a deprecated GOPATH módban (azaz GO111MODULE=off állapotban). Más építési parancsok, mint például a go build és go test, továbbra is működnek a deprecated GOPATH programokkal egy határozatlan ideig.
- A go mod init már nem próbálja importálni a modulok követelményeit más beszerzők konfigurációs fájljairól (mint például a Gopkg.lock).
- A go test -cover most már olyan csomagok esetében is összefoglalót nyújt a lefedettségről, amelyeknek nincsenek saját tesztfájljaik. A Go 1.22 előtt a go test -cover ilyen csomagok esetén a következőt jelentette: mymod/mypack [nincsenek tesztfájlok]
A Go 1.22-től kezdődően a csomagokban szereplő függvények lefedetlennek számítanak: mymod/mypack coverage: 0.0% a nyilatkozatokból. Kérjük, vegye figyelembe, hogy ha a csomag egyáltalán nem tartalmaz végrehajtható kódot, nem tudunk jelentős lefedettségi százalékot megadni; ilyen esetekben a go test továbbra is azt fogja jelezni, hogy nincsenek tesztfájlok.
- A trace eszköz webes felülete kismértékben frissült az új trace modul támogatásának érdekében, néhány hibát javítottak, és javították a különböző oldalak olvashatóságát. A webes felület most támogatja a trace-ek tanulmányozását eseményorientált nézetben. A trace néző mostantól teljes időtartamot is megjelenít minden rendszerhívás esetén. Ezek a fejlesztések csak a Go 1.22 vagy újabb verziók által készített programok által létrehozott trace-ek megtekintésére vonatkoznak. A jövőbeli kiadásban ezek közül a fejlesztések közül néhány az régebbi Go verziók által létrehozott trace-ekre is vonatkozni fog.
- A futtatási környezet mostantól a szemétgyűjtés metaadatait a heap minden egyes objektumához közelebb tárolja. Ez a változás a legtöbb Go program memóriaigényét körülbelül 1%-kal csökkenti a felesleges metadaták deduplikálásának révén. Néhány program esetében a javulás kisebb lehet, mivel ez a változás korrekciókat végez a memóriakiosztó mérethatárok osztályain, ezért egyes objektumok a méretosztály egy magasabb szintjére kerülhetnek. Ennek a változásnak következményeként egyes objektumok címei, amelyek korábban mindig 16 bájtos (vagy annál magasabb) határra voltak igazítva, mostantól csak 8 bájtos határra lesznek igazítva. Néhány program, amely assembler utasításokat használ, amelyek megkövetelik, hogy a memória címei 8 bájt méretnél nagyobb határon legyenek igazítva, és amelyek a memóriakiosztó korábbi viselkedésére támaszkodnak, hibát okozhatnak, de azt várjuk, hogy az ilyen programok ritkák lesznek. Az ilyen programok létrehozhatók a GOEXPERIMENT=noallocheaders beállítással, amely lehetővé teszi a régi metadatamodelhez való visszatérést és a korábbi igazítási viselkedés helyreállítását, de a csomagok tulajdonosainak frissíteniük kell assembler kódjukat az igazítási feltételek feltételezésének elkerülése érdekében, mivel ez a megoldás a jövőbeni megjelenések során eltávolításra kerül.
- A Go 1.20 kiadási megjegyzéseiben említett módon a Go 1.22 mostantól a Go 1.20 vagy újabb végső verzióját igényli az első fordításhoz. Azt várjuk, hogy a Go 1.24 a Go 1.22 vagy újabb végső verzióját fogja megkövetelni az első fordításhoz.
Eredeti (go.dev)
Forrás: linux.org.ru
