Release Go 1.22

De release van de programmeertaal Go 1.22 is gepresenteerd. Deze taal wordt ontwikkeld door Google met de betrokkenheid van de gemeenschap als een hybride oplossing die de hoge prestaties van gecompileerde talen combineert met de voordelen van scripts, zoals eenvoudiger schrijven van code, snelle ontwikkeling en bescherming tegen fouten. De code van het project wordt verspreid onder de BSD-licentie.

De syntaxis van Go is gebaseerd op bekende elementen van de C-taal, met enkele ontleningen uit de Oberon-taal. De taal is vrij beknopt, maar de code is gemakkelijk leesbaar en te begrijpen. Code in Go wordt gecompileerd naar afzonderlijke binaire uitvoerbare bestanden die native worden uitgevoerd, zonder gebruik te maken van een virtuele machine (profileringsmodules, foutopsporing en andere subsystemen voor het identificeren van problemen worden geïntegreerd als runtime-componenten), waardoor prestaties worden bereikt die vergelijkbaar zijn met C-programma's.

Het project is vanaf het begin ontworpen met het oog op multithreading en efficiënte werking op multicore systemen, waarbij het voorzieningen biedt voor het organiseren van parallelle berekeningen en communicatie tussen gelijktijdig uitvoerende methoden op het niveau van operators. De taal biedt ook ingebouwde middelen ter bescherming tegen het overschrijden van toegewezen geheugengebieden en maakt gebruik van een garbage collector.

Onder de veranderingen in de nieuwe release:

  • In for-lussen is ondersteuning toegevoegd voor het definiëren van reeksen van gehele getallen. Bijvoorbeeld, om waarden van 0 tot 9 te doorlopen, kan nu de lus 'for i := range 10 {...}' worden gebruikt.
  • In for-lussen is experimentele ondersteuning toegevoegd voor het definiëren van reeksen via functies (GOEXPERIMENT=rangefunc), die het mogelijk maakt om een functie als iterator op te geven. Bijvoorbeeld, 'for i, x := range slices.Backward(s) {...}'
  • Een oud probleem met for-lussen is opgelost waarbij bij het aanroepen van goroutines variabelen binnen de lus in verschillende iteraties gezamenlijk werden gebruikt. Bijvoorbeeld, de code values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } zal nu 'a', 'b' en 'c' afdrukken, in plaats van alleen 'c', zoals voorheen.
  • Er is optimalisatie doorgevoerd in het geheugenbeheer in de runtime, wat heeft geleid tot een prestatieverbetering van 1-3% en een vermindering van het geheugenverbruik in de meeste toepassingen met 1%.
  • De werkzaamheden aan de compiler zijn voortgezet met optimalisaties op basis van code-profileringsresultaten (PGO - Profile-guided optimization), waardoor rekening kan worden gehouden met kenmerken die tijdens de uitvoering van het programma worden vastgesteld. In de nieuwe versie zijn er middelen voor devirtuallisatie in de compiler geïntegreerd om indirecte aanroepen van verschillende methoden te vervangen door de uitvoering van uitgebreide inline-blokken.
  • Bij het inschakelen van PGO heeft de toegevoegde wijziging de prestaties van het merendeel van de programma's met 2-14% verhoogd.
  • In de compiler is een experimentele (GOEXPERIMENT=newinliner) verbeterde implementatie van de inlining-mechanismen toegevoegd, die heuristieken gebruikt om belangrijke en minder belangrijke operaties te scheiden.
  • In de standaardbibliotheek is het pakket ‘math/rand/v2’ toegevoegd, dat een vollediger API biedt en gebruik maakt van snellere algoritmen voor het genereren van pseudo-willekeurige getallen.
  • In het pakket net/http.ServeMux is de mogelijkheid toegevoegd om methoden en maskers in sjablonen aan te geven, bijvoorbeeld, het sjabloon ‘GET /static/{id}’ zal worden toegepast op verzoeken met de HTTP-methode ‘GET’ en het tweede segment van het gevraagde pad als de identificatie ‘id’ behouden.
  • In het pakket database/sql is ondersteuning toegevoegd voor het type Null[T], waarmee kolommen die NULL-waarden kunnen accepteren kunnen worden gescand. In het pakket slices is de functie Concat toegevoegd voor het samenvoegen van meerdere slices van elk type.
  • In de commando's voor het werken met werkruimten (collecties van modules) is de mogelijkheid toegevoegd om de map ‘vendor’ te gebruiken, die afhankelijkheden van de inhoud van de werkruimte bevat. Deze map wordt aangemaakt bij het uitvoeren van het commando ‘go work vendor’ en wordt gebruikt in buildcommando's wanneer de optie "-mod=vendor" is ingesteld (standaard inbegrepen bij aanwezigheid van de vendor-map).

Wijzigingen in het gedrag van de utilities.

  • go get wordt niet langer ondersteund buiten de module in de verouderde GOPATH-modus (dat wil zeggen met GO111MODULE=off). Andere bouwcommando's, zoals go build en go test, blijven voor verouderde GOPATH-programma's werken gedurende onbepaalde tijd.
  • go mod init probeert niet langer om modulevereisten uit configuratiebestanden van andere leveranciersstools (zoals Gopkg.lock) te importeren.
  • go test -cover drukt nu samenvattende informatie over de dekking af voor pakketten zonder eigen testbestanden. Tot Go 1.22 zou go test -cover voor zo'n pakket melden? mymod/mypack [geen testbestanden]

    en nu worden functies in het pakket beschouwd als niet gedekt: mymod/mypack coverage: 0.0% van de statements. Let op: als een pakket helemaal geen uitvoerbare code bevat, kunnen we geen significante dekkingspercentage rapporteren; voor dergelijke pakketten blijft go test melden dat er geen testbestanden zijn.

  • De webinterface van de traceertool is lichtjes bijgewerkt als onderdeel van het werk ter ondersteuning van de nieuwe tracer. Er zijn verschillende problemen opgelost en de leesbaarheid van verschillende pagina's is verbeterd. De webinterface ondersteunt nu het onderzoeken van traceringen in een stroomgericht formaat. De traceertool toont nu ook de totale duur van alle systeemaanroepen. Deze verbeteringen zijn alleen van toepassing op het bekijken van traceringen die zijn gemaakt door programma's die zijn vervaardigd met Go 1.22 of nieuwer. In de toekomstige versie zullen enkele van deze verbeteringen worden aangebracht in traceringen die zijn gemaakt met oudere versies van Go.
  • De runtime slaat nu metadata over het garbage collection op basis van types dichter bij elk object in de heap. Deze wijziging verlaagt ook het geheugengebruik van de meeste Go-programma's met ongeveer 1% door het dedupliceren van overbodige metadata. In sommige programma's kan de verbetering kleiner zijn, omdat deze wijziging de grenzen van de grootte van de geheugenallocator aanpast, waardoor sommige objecten op een grotere groottengrens kunnen worden verplaatst. Een gevolg van deze wijziging is dat de adressen van sommige objecten, die voorheen altijd waren uitgelijnd op een grens van 16 bytes (of hoger), nu alleen zijn uitgelijnd op een grens van 8 bytes. Sommige programma's die assembly-instructies gebruiken die vereisen dat geheugens op een grootte van meer dan 8 bytes zijn uitgelijnd en die vertrouwden op het vorige gedrag van de geheugenallocator, kunnen falen, maar we verwachten dat dergelijke programma's zeldzaam zullen zijn. Dergelijke programma's kunnen worden gemaakt met GOEXPERIMENT=noallocheaders met de mogelijkheid om terug te keren naar het oude metadata-model en het herstel van het vorige uitlijningsgedrag, maar pakketbeheerders moeten hun assemblycode bijwerken om aannames over uitlijning te vermijden, aangezien deze workaround in een toekomstig uitkomst 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 recenter voor de eerste build. We verwachten dat Go 1.24 de definitieve versie van Go 1.22 of latere versies voor de eerste build zal vereisen.
    Origineel (go.dev)

Bron: linux.org.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster