De release van de programmeertaal Go 1.22 wordt gepresenteerd, die door Google wordt ontwikkeld met deelname van de gemeenschap als een hybride oplossing die de hoge prestaties van gecompileerde talen combineert met dergelijke voordelen van scripttalen als het gemak van het schrijven van code , snelheid van ontwikkeling en foutbescherming. De projectcode wordt gedistribueerd onder de BSD-licentie.
De syntaxis van Go is gebaseerd op bekende elementen van de C-taal, met enkele ontleningen aan de Oberon-taal. De taal is vrij beknopt, maar de code is gemakkelijk te lezen en te begrijpen. Go-code wordt gecompileerd in afzonderlijke binaire uitvoerbare bestanden die native worden uitgevoerd, zonder gebruik te maken van een virtuele machine (profilering, foutopsporingsmodules en andere subsystemen voor het detecteren van runtime-problemen zijn geïntegreerd als runtime-componenten), wat prestaties mogelijk maakt die vergelijkbaar zijn met C-programma's.
Het project is in eerste instantie ontwikkeld met het oog op multi-threaded programmering en efficiënte werking op multi-core systemen, inclusief het bieden van middelen op operatorniveau voor het organiseren van parallel computergebruik en interactie tussen parallel uitgevoerde methoden. De taal biedt ook ingebouwde bescherming tegen overmatig toegewezen geheugenblokken en biedt de mogelijkheid om een garbage collector te gebruiken.
Onder de veranderingen in de nieuwe release:
- Ondersteuning voor het definiëren van bereiken van gehele getallen is toegevoegd aan “for”-lussen. Om bijvoorbeeld waarden van 0 tot 9 te doorlopen, kunt u nu de “for i := range 10 {...}”-lus gebruiken.
- Experimentele (GOEXPERIMENT=rangefunc) ondersteuning toegevoegd voor bereikfuncties tot for-lussen, waardoor u een functie als iterator kunt specificeren. Bijvoorbeeld: "voor i, x := bereik segmenten.Backward(s) {...}"
- Een al lang bestaand probleem opgelost met for-lussen die ervoor zorgden dat aanroepen naar coroutines (goroutines) lusvariabelen over iteraties heen deelden. Bijvoorbeeld de codewaarden:= []string{"a", "b", "c"} voor _, v := bereikwaarden { go func() { fmt.Println(v) done < - true }() } zal nu "a", "b" en "c" uitvoeren, en niet alleen "c", zoals voorheen.
- Het geheugenbeheer tijdens runtime werd geoptimaliseerd, wat leidde tot een prestatieverbetering met 1-3% en een vermindering van het geheugenverbruik in de meeste applicaties met 1%.
- Er werd verder gewerkt aan optimalisaties in de compiler op basis van de resultaten van codeprofilering (PGO - Profile-guided Optimization), waardoor rekening kan worden gehouden met kenmerken die zijn bepaald tijdens de uitvoering van het programma. In de nieuwe versie gebruikt de compiler devirtualisatietools om indirecte aanroepen van verschillende methoden te vervangen door de uitvoering van uitgebreide inline-blokken.
- Toen PGO was ingeschakeld, verbeterde de toegevoegde wijziging de prestaties van de meeste programma's met 2-14%.
- Een experimentele (GOEXPERIMENT=newinliner) verbeterde implementatie van het call inlining-mechanisme is aan de compiler toegevoegd, waarbij gebruik wordt gemaakt van heuristieken om belangrijke en onbelangrijke bewerkingen te scheiden.
- Het pakket "math/rand/v2" is toegevoegd aan de standaardbibliotheek, die een meer holistische API biedt en snellere algoritmen gebruikt voor het genereren van pseudo-willekeurige getallen.
- Het net/http.ServeMux-pakket heeft de mogelijkheid toegevoegd om methoden en maskers in sjablonen te specificeren. De sjabloon “GET /static/{id}/” zal bijvoorbeeld worden toegepast op verzoeken met de HTTP-methode “GET” en zal de waarde van het tweede segment van het gevraagde pad in de identificatie “ id".
- Het database/sql-pakket heeft ondersteuning toegevoegd voor het Null[T]-type, waardoor u kolommen kunt scannen die NULL kunnen zijn. De Concat-functie toegevoegd aan het segmentenpakket voor het samenvoegen van meerdere segmenten van elk type.
- In opdrachten voor het werken met werkruimten (verzamelingen modules) is het mogelijk om de map “vendor” te gebruiken, die afhankelijkheden bevat met de inhoud van de werkruimte. De directory wordt aangemaakt bij het uitvoeren van de opdracht “go work vendor” en wordt gebruikt in build-opdrachten wanneer de optie “-mod=vendor” is ingesteld (standaard ingeschakeld als er een leveranciersdirectory is).
Veranderingen in het gedrag van nutsvoorzieningen.
- go get wordt niet langer ondersteund buiten een module in de oudere GOPATH-modus (dat wil zeggen met GO111MODULE=uit). Andere build-opdrachten, zoals go build en go test, blijven voor onbepaalde tijd werken voor oudere GOPATH-programma's.
- go mod init probeert niet langer modulevereisten te importeren uit configuratiebestanden voor tools van andere leveranciers (zoals Gopkg.lock).
- go test -cover drukt nu dekkingssamenvattingen af voor gedekte pakketten die geen eigen testbestanden hebben. Zou u vóór Go 1.22 een test-coverrapport voor een dergelijk pakket gaan gebruiken? mymod/mypack [geen testbestanden]
en vanaf Go 1.22 worden functies in een pakket nu als ongedekt beschouwd: mymod/mypack-dekking: 0.0% van de instructies. Opmerking: als een pakket helemaal geen uitvoerbare code bevat, kunnen we geen betekenisvol dekkingspercentage rapporteren; voor dergelijke pakketten blijft go test ontbrekende testbestanden rapporteren.
- De webinterface van de traceertool is enigszins bijgewerkt als onderdeel van het werk om de nieuwe tracer te ondersteunen, enkele problemen op te lossen en de leesbaarheid van verschillende pagina's te verbeteren. De webinterface ondersteunt nu het verkennen van sporen in een thread-safe weergave. De traceviewer geeft nu ook de volledige duur van alle systeemoproepen weer. Deze verbeteringen zijn alleen van toepassing op het bekijken van sporen die zijn geproduceerd door programma's die zijn gebouwd op Go 1.22 of hoger. Een toekomstige release zal een aantal van deze verbeteringen aanbrengen in de sporen die door de oude versie van Go zijn geproduceerd.
- De runtime slaat nu op type gebaseerde metadata voor garbagecollection dichter bij elk heap-object op. Deze wijziging vermindert ook de geheugenoverhead van de meeste Go-programma's met ongeveer 1% door overtollige metagegevens te ontdubbelen. In sommige programma's kan de verbetering kleiner zijn omdat deze wijziging de grenzen van de grootteklasse van de geheugenallocator aanpast, waardoor sommige objecten naar een hogere grootteklasse kunnen worden verplaatst. Het effect van deze wijziging is dat de adressen van sommige objecten die voorheen altijd op een grens van 16 bytes (of hoger) waren uitgelijnd, nu alleen op een grens van 8 bytes zullen worden uitgelijnd. Sommige programma's die assembler-instructies gebruiken die vereisen dat geheugenadressen over 8 bytes worden uitgelijnd en vertrouwen op het eerdere uitlijningsgedrag van de geheugenallocator, kunnen mislukken, maar we verwachten dat dergelijke programma's zeldzaam zullen zijn. Dergelijke programma's kunnen worden gebouwd met GOEXPERIMENT=noallocheaders met de optie om terug te vallen op het oude metadatamodel en het eerdere uitlijningsgedrag te herstellen, maar pakketeigenaren moeten hun assemblagecode bijwerken om de uitlijningsaanname te vermijden, aangezien deze oplossing in een toekomstige release zal worden verwijderd. .
- Zoals vermeld in de release-opmerkingen van Go 1.20, vereist Go 1.22 nu de definitieve versie van Go 1.20 of hoger voor de eerste builds. We verwachten dat Go 1.24 de definitieve versie van Go 1.22 of hoger vereist voor de eerste build.
Origineel (go.dev)
Bron: linux.org.ru
