Quoi de neuf gopher ?

Février, c'est les crèpes, 28 ou 29 jours, de la neige (mais ça c'était avant) et la nouvelle version de GO :raised_hands:
La 1.18 est annoncée pour ce mois-ci avec une beta2 sortie début 2022. Elle contient des petites features bien sympathiques, dont voici les principales :
  • 2 nouveaux packages dans la librairie standard
  • une évolution du package strings
  • les workspaces
  • les fuzzing tests
  • et bien sur... tambour... roulement... les génériques, 2 alias et un opérateur
Regardons ça dans le détail.

Nouveaux packages

net/netIP

net/netIP est un package qui permet de manipuler plus facilement et efficacement les adresses IP autour de la struct Addr.

debug/buildinfo

debug/buildinfo va permettre d'acceder aux informations qui ont été utilisées lors du build comme les flags ou les versions de toolchain.

Evolution du package avec strings.Cut

cut vient étoffer le package strings et vient en complément de strings.SplitN, strings.Index, strings.IndexRune et strings.IndexByte. cut trouve un séparateur dans une chaîne de caractères, et renvoie ce qui se trouve avant, après et un bool si le séparateur est trouvé, sans slice de string []string comme splitN donc.
avant, après, ok := strings.Cut("daft-punk","-")
Pourquoi cette fonction ? La proposition initiale est plutôt intéressante à lire, c'est l'analyse d'un corpus de code qui a montré que la majorité de l'utilisation de strings.SplitN et strings.IndexByte était plus efficace avec cut car N=2, cut évitant de manipuler par la suite un slice de chaîne de caractères.

Fuzzings

La version 1.18 embarque dans sa toolchain une capacité à réaliser des fuzzing tests, ou tests à données aléatoires.
Comment les utiliser ? La fonction de test doit être contenue dans un fichier *_test.go, acceptant seulement un *testing.F (de la même façon qu'un *testing.T). Le "corpus de graine" (bon courage pour trouver une expression française adéquate) est fait par l'utilisation de la méthode (*testing.F).Add et la cible est appelée par la méthode (*testing.F).Fuzz qui accepte comme arguments un *testing.T et les fuzzing arguments définis avant.
image
Vous trouverez le tutoriel officiel ici.

Workspaces

la 1.18 arrive avec les Workspaces qui vont permettre de facilement changer de version de modules dans un projet, facilitant le développement sur différents modules au même moment.
Les workspaces viennent en complément de l'actuelle directive replace. Le mod workspace s'initie d'une façon assez proche des modules par un go work init, créant un fichier go.work de syntaxe similaire au go.mod. Le mode forcera tous les modules listés dans le go.work et vous pourrez utiliser la directive replace ce qui laissera votre go.mod propre.
Vous trouverez un petit exemple d'utilisation avec la 1.18beta1 sur le blog zerokspot.

Type parameters a.k.a. Generics

J'ai laissé la grosse feature pour la fin, celle-ci ayant déjà fait couler beaucoup trop de sang d'encre sur les internets. Voilà les generics qui débarquent sur Go !
Mais qu'est ce qu'un generic ?
Les generics vont permettre à des fonctions d'accepter différents types de données pour réaliser la meme chose. Donc finie la duplication de code par type de données et l'utilisation à foison de interface{} !
L'arrivée des generics embarque 2 alias : any qui est un alias pour une interface vide interface{} et comparable qui est une interface qui contient l'ensemble de types concrets qui sont comparables. Pour qu'un type T implémente l'interface comparable, il faut au choix que :
  • T ne soit pas une interface et accepte les opérations == et != ;
  • T soit une interface dont chaque implémentation contient des types comparable.
Par un exemple un int implémente comparable tandis que []string non, les slices ne pouvant être comparées.
L'équipe Go a créé un turoriel pour appréhender les generics - qui utilise aussi l'alias comparable ici.

That's all folks \o/

La release note contient aussi des évolutions mineures de la librairie standard disponible ici.

Go et Coddity

Coddity ne se lasse pas de développer un certain nombre de ses applications internes en Go, en particulier Confusioner, une application intégrée à Google Cloud Plateform permettant d'améliorer les performances de l'outil de NLU Dialogflow de Google.
Contactez nous si vous souhaitez en savoir plus !
Goddity
fin