Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
dev:go:tutoriels:ecrire_un_module_en_go [2023/08/05 13:09] – yoann | dev:go:tutoriels:ecrire_un_module_en_go [2023/08/06 10:13] (Version actuelle) – yoann | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
{{tag> | {{tag> | ||
- | |||
- | :TODO: | ||
====== Écrire un module en Go ====== | ====== Écrire un module en Go ====== | ||
Ligne 306: | Ligne 304: | ||
</ | </ | ||
- | ===== Retourner | + | ===== Retourner |
Nous allons modifier une dernière fois nos modules afin d' | Nous allons modifier une dernière fois nos modules afin d' | ||
Ligne 373: | Ligne 371: | ||
* La nouvelle fonction HelloAll() appelle la fonction Hello(). Cet usage des fonction est aussi désigné factorisation et réduit les risques d' | * La nouvelle fonction HelloAll() appelle la fonction Hello(). Cet usage des fonction est aussi désigné factorisation et réduit les risques d' | ||
* Créé une variable " | * Créé une variable " | ||
- | * Exécuter une boucle sur chaque élément de la slice names. Dans cette boucle **'' | + | * Exécuter une boucle sur chaque élément de la slice "names". Dans cette boucle **'' |
+ | |||
+ | Dans notre fichier hello.go nous pouvons à présent faire quelques changements : | ||
+ | |||
+ | <code go hello.go> | ||
+ | package main | ||
+ | |||
+ | import ( | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | ) | ||
+ | |||
+ | func main() { | ||
+ | // | ||
+ | log.Default().SetPrefix(" | ||
+ | // | ||
+ | //de ligne | ||
+ | log.SetFlags((0)) | ||
+ | |||
+ | // | ||
+ | names := []string{" | ||
+ | |||
+ | //Obtenir un message de bienvenue pour chaque nom | ||
+ | messages, err := greetings.HelloAll(names) | ||
+ | |||
+ | //Si une erreur est retournée, elle est affichée dans la console | ||
+ | //et le programme s' | ||
+ | if err != nil { | ||
+ | log.Fatal(err) | ||
+ | } | ||
+ | |||
+ | //Affiche le message dans la console | ||
+ | fmt.Println(messages) | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Les changements sont les suivants : | ||
+ | * Création d'une variable " | ||
+ | * Passage en argument de la variable " | ||
+ | |||
+ | Exécutons le code ainsi modifié : | ||
+ | <code bash> | ||
+ | go run . | ||
+ | map[Alfred: | ||
+ | </ | ||
+ | |||
+ | ===== Ajout d' un test unitaire ===== | ||
+ | |||
+ | Maintenant que notre code a implémenter les fonctionnalités souhaitées, | ||
+ | |||
+ | Go intègre le support des tests unitaires. Le paquetage " | ||
+ | |||
+ | * Dans le répertoire greetings, créer un fichier '' | ||
+ | * Éditer le fichier greetings_test.go avec le contenu suivant : | ||
+ | |||
+ | <code go greetings_test.go> | ||
+ | package greetings | ||
+ | |||
+ | import ( | ||
+ | " | ||
+ | " | ||
+ | ) | ||
+ | |||
+ | // TestHelloName appelle Hello() avec un nom et vérifie | ||
+ | // la valeur retournée. | ||
+ | func TestHelloName(t *testing.T) { | ||
+ | aName := " | ||
+ | want := regexp.MustCompile(`\b` + aName + `\b`) | ||
+ | msg, err := Hello(" | ||
+ | |||
+ | if !want.MatchString(msg) || err != nil { | ||
+ | t.Fatalf(`Hello(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // TestHelloEmpty appelle Helo() avec une chaine vide doit | ||
+ | // retourner une erreur. | ||
+ | func TestHelloEmpty(t *testing.T) { | ||
+ | msg, err := Hello("" | ||
+ | |||
+ | if msg != "" | ||
+ | t.Fatalf(`Hello("" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Dans ce code on a : | ||
+ | * Définit des fonctions de test dans le même paquetage que le code à tester ; | ||
+ | * Définit deux fonctions de test pour tester la fonction greetings.Hello(). Les fonctions de test doivent avoir un nom préfixé par ' | ||
+ | * A propos des deux tests: | ||
+ | * TestHelloName() appelle la fonction Hello() avec un nom en argument et vérifie que la fonction est capable de retourner un message valide. Si le retour est une erreur ou un message avec un contenu non attendu on utilise le paramètre " | ||
+ | * TestHelloEmpty() appelle la fonction Hello() avec une chaine vide. Ce test permet de valider le fonctionnement de la gestion des erreurs. Si le test retourne une chaine non vide ou ne retourne pas d' | ||
+ | |||
+ | Depuis la ligne de commande on peut lancer les tests: | ||
+ | <code powershell> | ||
+ | go test | ||
+ | </ | ||
+ | |||
+ | La commande **go test** exécute les fonctions de test (ayant des noms préfixés par " | ||
+ | |||
+ | Si on introduit (ici volontairement) une erreur lors du developpement en modifiant le comportement de la fonction Hello(), une des fonctions de test pourra révèler l' | ||
+ | |||
+ | < | ||
+ | go test -v | ||
+ | === RUN | ||
+ | greetings_test.go: | ||
+ | --- FAIL: TestHelloName (0.00s) | ||
+ | === RUN | ||
+ | --- PASS: TestHelloEmpty (0.00s) | ||
+ | FAIL | ||
+ | exit status 1 | ||
+ | FAIL example.com/ | ||
+ | </ | ||
+ | |||
+ | ===== Compiler et installer l' | ||
+ | |||
+ | Ici on aborde quelques nouvelles commandes Go. La commande go run permet de rapidement compiler et exécuter un programme lors du développement alors qu'on effectue régulièrement des modifications. | ||
+ | |||
+ | * La commande **'' | ||
+ | * La commande go **'' | ||
+ | |||
+ | Lorsque le binaire est créé avec **'' | ||
+ | |||
+ | Pour connaitre le chemin du dossier d' | ||
+ | < | ||
+ | go list -f ' | ||
+ | </ | ||
+ | |||
+ | Vérifier que le dossier d' | ||
+ | |||
+ | <code powershell> | ||
+ | echo $env:PATH | ||
+ | </ | ||
+ | |||
+ | La variable PATH doit contenir le dossier d' | ||
+ | |||
+ | Si vous souhaitez installer le binaire dans un répertoire différent de votre PATH, vous pouvez modifier/ | ||
+ | |||
+ | < | ||
+ | go env -w GOBIN=C: | ||
+ | </ | ||
+ | |||
+ | Une fois le chemin d' | ||
===== Références ===== | ===== Références ===== | ||
* https:// | * https:// |