Le langage de programmation Go 1.22 a été publié, développée par Google avec la contribution de la communauté, combinant la haute performance des langages compilés aux avantages des langages de script, tels que la facilité d'écriture de code, la rapidité de développement et la protection contre les erreurs. Le code du projet est distribué sous la licence BSD.
La syntaxe de Go est basée sur des éléments familiers du langage C avec des emprunts au langage Oberon. Le langage est assez concis, mais le code est facilement lisible et compréhensible. Le code écrit en Go est compilé en fichiers exécutables binaires distincts, exécutés nativement, sans utiliser de machine virtuelle (les modules de profilage, de débogage et d'autres sous-systèmes d'identification des problèmes à l'exécution sont intégrés en tant que composants runtime), permettant d'atteindre des performances comparables à celles des programmes en C.
Le projet a été initialement développé en tenant compte de la programmation multithread et du travail efficient sur des systèmes multicœurs, offrant notamment des moyens d'organisation des calculs parallèles et d'interaction entre les méthodes s'exécutant en parallèle au niveau des opérateurs. Le langage propose également des moyens intégrés de protection contre les dépassements des zones allouées de mémoire et permet l'utilisation d'un ramasse-miettes.
Parmi les changements de la nouvelle version :
- Des prises en charge des plages d'entiers ont été ajoutées aux boucles « for », par exemple, pour itérer sur les valeurs de 0 à 9, vous pouvez maintenant utiliser la boucle « for i := range 10 {…} ».
- Une prise en charge expérimentale des fonctions de détermination de plage (GOEXPERIMENT=rangefunc) a été ajoutée aux boucles « for », permettant de spécifier une fonction en tant qu'itérateur. Par exemple, « for i, x := range slices.Backward(s) {…} »
- Un ancien problème avec les boucles « for » a été résolu, où l'appel de goroutines provoquait le partage des variables de boucle entre les différentes itérations. Par exemple, le code values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } affichera désormais « a », « b » et « c », et non seulement « c » comme auparavant.
- L'optimisation de la gestion de la mémoire dans le runtime a conduit à une augmentation de la performance de 1 à 3 % et à une réduction de la consommation de mémoire dans la plupart des applications de 1 %.
- Le travail sur l'activation des optimisations basées sur les résultats de profiling de code (PGO — optimisation guidée par le profil) a été poursuivi, permettant de prendre en compte les spécificités déterminées lors de l'exécution du programme. Dans cette nouvelle version, le compilateur utilise des outils de dévirtualisation pour remplacer les appels indirects de diverses méthodes par des blocs inline déployés.
- Avec l'activation de PGO, la modification ajoutée a permis d'augmenter les performances de la plupart des programmes de 2 à 14 %.
- Une amélioration expérimentale (GOEXPERIMENT=newinliner) de la mise en œuvre du mécanisme de déploiement (inlining) des appels a été ajoutée au compilateur, utilisant une heuristique pour séparer les opérations importantes et secondaires.
- La bibliothèque standard a ajouté le paquet « math/rand/v2 », qui propose une API plus cohérente et utilise des algorithmes de génération de nombres pseudo-aléatoires plus rapides.
- Le paquet net/http.ServeMux a été amélioré pour permettre la spécification de méthodes et de masques dans les modèles, par exemple, le modèle « GET /static/{id}/ » sera appliqué aux requêtes utilisant la méthode HTTP « GET » et conservera la valeur du deuxième segment du chemin demandé dans l'identifiant « id ».
- Le paquet database/sql a ajouté le support du type Null[T], permettant de scanner des colonnes qui peuvent accepter la valeur NULL. De plus, le paquet slices a ajouté une fonction Concat pour fusionner plusieurs slices de n'importe quel type.
- Les commandes pour travailler avec des espaces de travail (collections de modules) maintenant permettent d'utiliser le répertoire « vendor », qui contient les dépendances du contenu de l'espace de travail. Ce répertoire est créé lors de l'exécution de la commande « go work vendor » et est utilisé dans les commandes de construction lorsqu'on spécifie l'option "-mod=vendor" (qui est incluse par défaut si le répertoire vendor existe).
Modifications du comportement des utilitaires.
- La commande go get n'est plus supportée en dehors du module dans le mode GOPATH obsolète (c'est-à-dire avec GO111MODULE=off). D'autres commandes de compilation, comme go build et go test, continueront de fonctionner pour les programmes GOPATH obsolètes pendant une période indéfinie.
- La commande go mod init ne tente plus d'importer les dépendances des modules à partir des fichiers de configuration d'autres outils de fournisseurs (comme Gopkg.lock).
- go test -cover imprime maintenant des données récapitulatives sur la couverture des paquets couverts qui n'ont pas de fichiers de test propres. Avant Go 1.22, go test -cover pour un tel paquet rapportait ? mymod/mypack [no test files]
et maintenant avec Go 1.22, les fonctions dans le paquet sont considérées comme non couvertes : mymod/mypack coverage: 0.0% des instructions. Notez que si le paquet ne contient pas de code exécutable, nous ne pouvons pas rapporter un pourcentage de couverture significatif ; pour ces paquets, go test continuera de signaler l'absence de fichiers de test.
- L'interface web de l'outil trace a été légèrement mise à jour dans le cadre du support du nouveau traceur, certains problèmes ont été résolus et la lisibilité de plusieurs pages a été améliorée. L'interface web prend désormais en charge l'exploration des traces dans une vue orientée flux. Le visualiseur de traces affiche désormais également la durée totale de tous les appels système. Ces améliorations ne s'appliquent qu'à l'affichage des traces créées par des programmes compilés avec Go 1.22 ou plus récent. Dans une future version, certaines de ces améliorations seront apportées aux traces générées par l'ancienne version de Go.
- L'environnement d'exécution stocke désormais les métadonnées de collecte des déchets basées sur les types plus près de chaque objet dans le tas. Ce changement réduit également le coût mémoire de la plupart des programmes Go d'environ 1 % grâce à la dé-duplication des métadonnées redondantes. Dans certains programmes, l'amélioration peut être moindre, car ce changement corrige les limites de classe de taille de l'allocateur de mémoire, ce qui peut déplacer certains objets vers une classe de taille supérieure. En conséquence, certaines adresses d'objets qui étaient auparavant toujours alignées sur une limite de 16 octets (ou plus) ne seront désormais alignées que sur une limite de 8 octets. Certains programmes utilisant des instructions d'assemblage nécessitant que les adresses mémoire soient alignées sur une taille supérieure à 8 octets et s'appuyant sur l'ancien comportement d'alignement de l'allocateur de mémoire, peuvent échouer, mais nous nous attendons à ce que ces programmes soient rares. De tels programmes peuvent être créés avec GOEXPERIMENT=noallocheaders avec la possibilité de revenir à l'ancien modèle de métadonnées et de restaurer le comportement d'alignement précédent, mais les propriétaires de paquets devraient mettre à jour leur code d'assemblage pour éviter des hypothèses d'alignement, car cette solution de contournement sera supprimée dans une future version.
- Comme mentionné dans les notes de version de Go 1.20, Go 1.22 nécessite désormais la version finale de Go 1.20 ou plus récente pour la première compilation. Nous prévoyons que Go 1.24 nécessitera la version finale de Go 1.22 ou plus récente pour la première compilation.
Original (go.dev)
Source : linux.org.ru
