UtgÄvan av programmeringssprÄket Go 1.22 har presenterats, vilket utvecklas av Google i samarbete med communityn som en hybridlösning, som kombinerar den höga prestandan hos kompilatorbaserade sprÄk med sÄdana fördelar som enkla kodscript, snabb utveckling och skydd mot fel. Koden i projektet distribueras under BSD-licensen.
Go:s syntax Àr baserad pÄ bekanta element frÄn C-sprÄket, med vissa lÄn frÄn Oberon-sprÄket. SprÄket Àr tillrÀckligt koncist, men koden Àr lÀttlÀst och förstÄelig. Kod pÄ Go kompileras till fristÄende binÀra körbara filer som körs nativt, utan nÄgon virtuell maskin (profileringsmoduler, felsökningsverktyg och andra systemkomponenter som identifierar problem under körning integreras som runtime-komponenter), vilket gör att man uppnÄr prestanda som Àr jÀmförbar med program skrivna i C.
Projektet utvecklas ursprungligen med fokus pÄ flertrÄdning och effektiv anvÀndning pÄ flerkÀrniga system, och tillhandahÄller ocksÄ realiserade operatörsbaserade medel för att organisera parallella berÀkningar och interaktion mellan parallellt körande metoder. SprÄket tillhandahÄller ocksÄ inbyggda medel för att skydda mot att man gÄr utanför tillÄtna omrÄden av allokerade minnesblock och ger möjlighet att anvÀnda en skrÀpsamlare.
Bland förÀndringarna i den nya versionen:
- I for-loopar har stöd för att definiera intervall av heltal lagts till, till exempel för att iterera över vÀrden frÄn 0 till 9 kan man nu anvÀnda loopen "for i := range 10 {...}".
- I for-loopar har experimentellt (GOEXPERIMENT=rangefunc) stöd för funktionsintervall lagts till, vilket tillÄter att ange en funktion som iterator. Till exempel, "for i, x := range slices.Backward(s) {...}".
- Ett lÄngvarigt problem med for-loopar har ÄtgÀrdats, vilket ledde till gemensam anvÀndning av loopvariabler i olika iterationer vid anrop av goroutines. Till exempel kommer koden values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } nu att skriva ut "a", "b" och "c", istÀllet för endast "c" som det var tidigare.
- Arbetet med att optimera minnesanvÀndningen under körning har genomförts, vilket har lett till en prestandaförbÀttring pÄ 1-3% och en minskning av minnesförbrukningen i de flesta applikationer med 1%.
- Arbetet med att implementera optimeringar baserade pÄ profilering av kod (PGO - Profile-guided optimization) i kompilatorn fortsÀtter, vilket gör det möjligt att beakta egenskaper som definieras under programmets körning. I den nya versionen har verktyg för devirtualisering anvÀnts för att ersÀtta indirekta anrop av olika metoder med exekvering av utvecklade inline-block.
- Med aktiverad PGO har den tillagda Àndringen lett till en prestandaförbÀttring för de flesta program med 2-14%.
- En experimentell (GOEXPERIMENT=newinliner) förbÀttrad implementering av mekanismen för inlining av anrop har lagts till i kompilatorn, som anvÀnder heuristik för att separera viktiga och sekundÀra operationer.
- Till standardbiblioteket har paketet «math/rand/v2» lagts till, dÀr en mer heltÀckande API har föreslagits och snabbare algoritmer för generering av pseudo-slumptal har anvÀnts.
- I paketet net/http.ServeMux har möjligheten att ange metoder och masker i mallar lagts till, till exempel kommer mallen «GET /static/{id}/» att tillÀmpas pÄ begÀrningar med HTTP-metoden «GET» och behÄlla vÀrdet av den andra sektionen av den begÀrda vÀgen i identifieraren «id».
- I paketet database/sql har stöd för typen Null[T] lagts till, vilket gör det möjligt att skanna kolumner som kan ta vÀrdet NULL. I paketet slices har funktionen Concat lagts till för att sammanfoga flera skivor av vilken typ som helst.
- I kommandon för att arbeta med arbetsytor (modulkollektioner) har det blivit möjligt att anvÀnda katalogen «vendor», som innehÄller beroenden till innehÄllet i arbetsytan. Katalogen skapas nÀr kommandot «go work vendor» körs och anvÀnds i byggkommandon vid angivande av alternativet "-mod=vendor" (aktiveras som standard om katalogen vendor finns).
Ăndringar i beteendet hos verktygen.
- go get stöds inte lÀngre utanför modulen i det avvecklade GOPATH-lÀget (det vill sÀga med GO111MODULE=off). Andra byggkommandon, som go build och go test, kommer att fortsÀtta fungera för avvecklade GOPATH-program under obestÀmd tid.
- go mod init försöker inte lÀngre importera modulkrav frÄn konfigurationsfiler för andra leverantörsverktyg (sÄsom Gopkg.lock).
- go test -cover skriver nu ut sammanstÀllande tÀckningsdata för tÀckta paket som inte har egna testfiler. Fram till Go 1.22 rapporterade go test -cover för ett sÄdant paket? mymod/mypack [inga testfiler]
och nu med Go 1.22 betraktas funktioner i paketet som otÀckta: mymod/mypack tÀckning: 0,0 % av uttalanden. Observera: om paketet helt saknar körbar kod kan vi inte rapportera om en meningsfull andel tÀckning; för sÄdana paket kommer go test fortsatt att rapportera att det saknas testfiler.
- WebbgrÀnssnittet för trace-verktyget har uppdaterats nÄgot i samband med stödet för den nya spÄraren, vissa problem har ÄtgÀrdats och lÀsbarheten pÄ olika sidor har förbÀttrats. WebbgrÀnssnittet stöder nu att utforska spÄrningar i ett strömriktat format. Trace-visaren visar nu ocksÄ den totala varaktigheten för alla systemanrop. Dessa förbÀttringar gÀller endast vid visning av spÄrningar skapade av program som skapades med Go 1.22 eller senare. I en kommande version kommer nÄgra av dessa förbÀttringar att införas i spÄrningar som skapats av Àldre versioner av Go.
- Körningsmiljön lagrar nu skrÀpupplysningar baserat pÄ typer nÀrmare varje objekt i heapen. Denna förÀndring sÀnker ocksÄ minneskostnaderna för de flesta Go-program med cirka 1 % tack vare deduplicering av överflödiga metadata. I vissa program kan förbÀttringen vara mindre, eftersom denna förÀndring justerar grÀnserna för klassstorlek i minnesallokatorn, vilket innebÀr att vissa objekt kan flyttas till en högre klassstorlek. Konsekvensen av denna förÀndring Àr att adresser till vissa objekt, som tidigare alltid har varit förstÄdda som justerade mot 16 bytes (eller mer), nu endast kommer att justeras mot 8 bytes. Vissa program som anvÀnder assemblerinstruktioner och krÀver att minnesadresser justeras mot storlekar större Àn 8 bytes och förlitar sig pÄ det tidigare beteendet hos minnesallokatorn kan misslyckas, men vi förvÀntar oss att sÄdana program kommer att vara sÀllsynta. SÄdana program kan skapas med GOEXPERIMENT=noallocheaders som ger möjlighet att ÄtergÄ till den gamla metadata-modellen och ÄterstÀlla det tidigare justeringsbeteendet, men paketÀgare bör uppdatera sin assemblerkod för att undvika antaganden om justering, eftersom denna genvÀg kommer att tas bort i en framtida release.
- Som nÀmndes i versionsnoterna för Go 1.20, krÀver Go 1.22 nu en slutversion av Go 1.20 eller nyare för initial byggnation. Vi förvÀntar oss att Go 1.24 kommer att krÀva en slutversion av Go 1.22 eller en senare version för initial byggnation.
Originalet (go.dev)
KĂ€lla: linux.org.ru
