Langage
Go 1.20 inclut quatre changements dans le langage. Go 1.17 avait ajouté les conversion d'une tranche vers un pointeur de tableau. Go 1.20 étend cela pour permettre les conversions d'une tranche vers un tableau : étant donné une tranche x, [4]byte(x) peut maintenant être écrit au lieu de *(*[4]byte)(x). En outre, le paquetage unsafe définit trois nouvelles fonctions : SliceData, String, et StringData. Avec la fonction Slice de Go 1.17, ces fonctions offrent maintenant la possibilité complète de construire et de déconstruire des valeurs de type tranche et chaîne, sans dépendre de leur représentation exacte.
La spécification définit maintenant que les valeurs struct sont comparées un champ à la fois, en considérant les champs dans l'ordre où ils apparaissent dans la définition du type struct, et en s'arrêtant à la première non-concordance. Auparavant, la spécification pouvait être lue comme si tous les champs devaient être comparés au-delà de la première discordance. De même, la spécification définit maintenant que les valeurs des tableaux sont comparées un élément à la fois, dans l'ordre croissant des index. Dans les deux cas, la différence affecte le fait que certaines comparaisons doivent paniquer.
Les programmes existants restent inchangés : la nouvelle formulation de la spécification décrit ce que les implémentations ont toujours fait. Les types comparables (tels que les interfaces ordinaires) peuvent maintenant satisfaire les contraintes comparables, même si les arguments de type ne sont pas strictement comparables. Cela permet d'instancier un paramètre de type contraint par comparable (par exemple, un paramètre de type pour une clé de carte générique définie par l'utilisateur) avec un argument de type non strictement comparable tel qu'un type d'interface, ou un type composite contenant un type d'interface.
Ports
Windows
Go 1.20 est la dernière version qui fonctionnera sur toutes les versions de Windows 7, 8, Server 2008 et Server 2012. Go 1.21 nécessitera au moins Windows 10 ou Server 2016.
Darwin et iOS
Go 1.20 est la dernière version qui fonctionnera sur macOS 10.13 High Sierra ou 10.14 Mojave. La version 1.21 de Go nécessitera macOS 10.15 Catalina ou une version ultérieure.
FreeBSD/RISC-V
Go 1.20 ajoute un support expérimental pour FreeBSD sur RISC-V (GOOS=freebsd, GOARCH=riscv64).
Outils
Commande Go
Le répertoire $GOROOT/pkg ne stocke plus les archives de paquets précompilés pour la bibliothèque standard : go install ne les écrit plus, go build ne les vérifie plus, et la distribution Go ne les fournit plus. Au lieu de cela, les paquets de la bibliothèque standard sont construits selon les besoins et mis en cache dans le cache de construction, tout comme les paquets hors GOROOT. Ce changement réduit la taille de la distribution Go et évite également le déséquilibre de la chaîne d'outils C pour les paquets qui utilisent cgo.
L'implémentation de go test -json a été améliorée pour la rendre plus robuste. Les programmes qui exécutent go test -json n'ont pas besoin de mises à jour. Les programmes qui invoquent directement l'outil go test2json doivent maintenant exécuter le binaire de test avec -v=test2json (par exemple, go test -v=test2json ou ./pkg.test -test.v=test2json) au lieu du simple -v. Un changement lié à go test -json est l'ajout d'un événement dont l'action est définie pour démarrer au début de l'exécution de chaque programme de test.
Lors de l'exécution de plusieurs tests à l'aide de la commande go, ces événements de démarrage sont garantis d'être émis dans le même ordre que les paquets nommés sur la ligne de commande. La commande go définit désormais des balises de construction de caractéristiques d'architecture, telles que amd64.v2, pour permettre de sélectionner un fichier d'implémentation de paquet en fonction de la présence ou de l'absence d'une caractéristique d'architecture particulière. Les sous-commandes go acceptent désormais -C <dir> pour changer le répertoire en <dir> avant d'exécuter la commande.
Cela peut être utile pour les scripts qui doivent exécuter des commandes dans plusieurs modules différents. Les commandes go build et go test n'acceptent plus le drapeau -i, qui est déprécié depuis Go 1.16. La commande go generate accepte désormais -skip <pattern> pour ignorer les directives //go:generate correspondant à <pattern>. La commande go test accepte désormais -skip <pattern> pour ignorer les tests, sous-tests ou exemples correspondant à <pattern>.
go version
La commande go version -m prend désormais en charge la lecture d'un plus grand nombre de types de binaires Go, notamment les DLL Windows construites avec go build -buildmode=c-shared et les binaires Linux sans autorisation d'exécution.
Cgo
La commande go désactive désormais cgo par défaut sur les systèmes ne disposant pas d'une chaîne d'outils C. Plus précisément, lorsque la variable d'environnement CGO_ENABLED n'est pas définie, que la variable d'environnement CC n'est pas définie et que le compilateur C par défaut (généralement clang ou gcc) n'est pas trouvé dans le chemin d'accès, CGO_ENABLED prend la valeur 0 par défaut.
L'effet le plus important de ce changement par défaut est que lorsque Go est installé sur un système sans compilateur C, il utilisera désormais des constructions Go pures pour les paquets de la bibliothèque standard qui utilisent cgo, au lieu d'utiliser les archives de paquets prédistribuées (qui ont été supprimées, comme indiqué ci-dessus) ou d'essayer d'utiliser cgo et d'échouer. Cela permet à Go de mieux fonctionner dans certains environnements de conteneurs minimaux ainsi que sur macOS, où les archives de paquets prédistribuées ne sont plus utilisées pour les paquets basés sur cgo depuis Go 1.16.
Les paquets de la bibliothèque standard qui utilisent cgo sont net, os/user et plugin. Sous macOS, les paquets net et os/user ont été réécrits pour ne pas utiliser cgo : le même code est maintenant utilisé pour les constructions cgo et non cgo ainsi que pour les compilations croisées. Sous Windows, les paquets net et os/user n'ont jamais utilisé cgo. Sur les autres systèmes, les compilations avec cgo désactivé utiliseront une version purement Go de ces paquets.
Sous macOS, le détecteur de course a été réécrit pour ne pas utiliser cgo : les programmes avec détecteur de course peuvent être construits et exécutés sans Xcode. Sous Linux et d'autres systèmes Unix, ainsi que sous Windows, une chaîne d'outils C hôte est nécessaire pour utiliser le détecteur de course.
Cover
Go 1.20 supporte la collecte de profils de couverture de code pour les programmes (applications et tests d'intégration), par opposition aux seuls tests unitaires. Pour collecter des données de couverture pour un programme, construisez-le avec l'option -cover de go build, puis exécutez le binaire résultant avec la variable d'environnement GOCOVERDIR définie sur un répertoire de sortie pour les profils de couverture.
Vet
L'outil vet signale maintenant les références aux variables de boucle suite à un appel à T.Parallel() dans les corps de fonctions de sous-tests. Ces références peuvent observer la valeur de la variable d'une itération différente (ce qui entraîne généralement le saut de cas de test) ou un état invalide dû à un accès concurrent non synchronisé.
En outre, l'outil vet signale désormais l'utilisation du format de temps 2006-02-01 (yyyy-dd-mm) avec Time.Format et time.Parse. Ce format n'apparaît pas dans les standards de date courants, mais est fréquemment utilisé par erreur lors de la tentative d'utiliser le format de date ISO 8601 (aaaa-mm-jj).
Runtime
Certaines structures de données internes du ramasse-miettes ont été réorganisées pour être plus efficaces en termes d'espace et de CPU. Ce changement réduit les frais généraux de mémoire et améliore les performances globales du CPU jusqu'à 2 %. Le ramasse-miettes se comporte de manière moins erratique en ce qui concerne l'assistance des goroutines dans certaines circonstances. Go 1.20 ajoute un nouveau paquet runtime/coverage contenant des API pour écrire des données de profil de couverture au moment de l'exécution à partir de programmes longs et/ou de programmes serveurs qui ne se terminent pas par os.Exit().
Compilateur
Go 1.20 ajoute le support de PGO (profile-guided optimization). PGO permet à la chaîne d'outils d'effectuer des optimisations spécifiques à l'application et à la charge de travail sur la base des informations de profil d'exécution. Actuellement, le compilateur prend en charge les profils CPU pprof, qui peuvent être collectés par les moyens habituels, tels que les paquets runtime/pprof ou net/http/pprof. Pour activer PGO, passez le chemin d'un fichier de profil pprof via l'option -pgo à go build. Go 1.20 utilise PGO pour mettre en ligne de manière plus agressive les fonctions aux endroits où les appels sont importants.
Les benchmarks pour un ensemble représentatif de programmes Go montrent que l'activation de PGO améliore les performances d'environ 3 à 4 %. Voir le guide d'utilisation de PGO pour une documentation détaillée. L'équipe prévoit d'ajouter d'autres optimisations guidées par le profil dans les prochaines versions. Notez que PGO est un aperçu, donc veuillez l'utiliser avec la prudence appropriée.
Linker
Sous Linux, l'éditeur de liens sélectionne maintenant l'interpréteur dynamique pour glibc ou musl au moment de la liaison. Sous Windows, l'éditeur de liens Go supporte maintenant les chaînes d'outils C modernes basées sur LLVM. Go 1.20 utilise les préfixes go: et type: pour les symboles générés par le compilateur plutôt que go. et type. Cela permet d'éviter toute confusion pour les paquets utilisateurs dont le nom commence par go:. Le paquet debug/gosym comprend cette nouvelle convention de dénomination pour les binaires construits avec Go 1.20 et plus.
Bibliothèque principale
Nouveau paquet crypto/ecdh
Go 1.20 ajoute un nouveau paquet crypto/ecdh pour fournir un support explicite pour les échanges de clés Elliptic Curve Diffie-Hellman sur les courbes NIST et Curve25519. Les programmes devraient utiliser crypto/ecdh au lieu de la fonctionnalité de bas niveau de crypto/elliptic pour ECDH, et des modules tiers pour des cas d'utilisation plus avancés.
Encapsulation d'erreurs multiples
Go 1.20 étend la prise en charge de l'encapsulation des erreurs pour permettre à une erreur d'envelopper plusieurs autres erreurs. Une erreur e peut envelopper plus d'une erreur en fournissant une méthode Unwrap qui renvoie une []erreur. Les fonctions errors.Is et errors.As ont été mises à jour pour inspecter les erreurs enveloppées plusieurs fois.
La fonction fmt.Errorf prend désormais en charge les occurrences multiples du verbe de format %w, ce qui lui permet de renvoyer une erreur qui englobe tous les opérandes de cette erreur. La nouvelle fonction errors.Join renvoie une erreur enveloppant une liste d'erreurs.
Source : Go 1.20
Et vous ?
Que pensez-vous des nouveautés introduits par Go 1.2 ?
Voir aussi
Enquête sur le langage Go : les génériques proposés par Go 1.18 ont rapidement été adoptés, les dépendances tierces sont un problème de sécurité majeur
Go 1.20 est la dernière version qui fonctionnera sur toutes les versions de Windows 7, 8, Server 2008 et Server 2012, la version 1.21 nécessitera au moins Windows 10 ou Server 2016
Go 1.19 est disponible et se concentre sur le développement des génériques ainsi que sur d'importantes améliorations des performances, jusqu'à 20 % pour certains programmes génériques