Gérer les arguments de votre programme golang

La bibliothèque standard de go contient deux fonctionnalités que nous allons aborder dans cet article :
  1. La gestion de la ligne de commande : qui est très similaire aux autres langages de programmation
  2. Les drapeaux (flags) : qui permet de simplifier la gestion des options ainsi que leur documentation

Les arguments de la ligne de commande

Les arguments de la ligne de commande permettent de paramétrer l'exécution du programme golang. Dans cet exemple, le programme go reçoit en paramètre les arguments build et exemple.go. Ce qui signifit qu'il reçoit l'instruction de compiler le fichier source exemple.go :
go build exemple.go
Avec l'exemple de code ci-après, on voit que la variable os.Args donne accès aux arguments de la ligne de commande (il s'agit en fait d'un slice). La première valeur de ce slice (la valeur stockée à l'index 0) est le nom de l'exécutable (plus exactement son chemin par rapport à l'endroit où vous l'avez exécuté) et os.Args[1:] (comprendre toutes les valeurs du slice à partir de l'index 1 inclus) contient les arguments de votre programme go. On peut aussi récupérer directement un des arguments en utilisant sa position dans le slice.
package main

import (
	"os"
	"fmt"
)

func main() {
    arguments := os.Args				//La ligne de commande avec le nom de l'exécutable
    argumentsSansExe := os.Args[1:]		//La ligne de commande sans le nom de l'exécutable
    unArgument := os.Args[3]			//Accès direct au troisième élément de la ligne de commande

    fmt.Println(arguments)
    fmt.Println(argumentsSansExe)
    fmt.Println(unArgument)
}
Afin de bien comprendre cet exemple, je vous encourage à compiler cet exemple (plutôt qu'utiliser la commande go run exemple.go), puis à l'exécuter ainsi :
go build exemple.go
exemple a b c d e

Comment récupérer l'emplacement exact de l'exécutable ?

Vos expériences de lancement vous ont peut-être appris que os.Args[0] n'est pas une manière fiable de récupérer l'emplacement exact de l'exécutable, car selon le contexte d'exécution, les résultats peuvent varier. Par exemple, si vous le lancez de cette manière :
go run command_line.go a b c d e
La valeur d'os.Args[0] indiquera un chemin d'accès qui correspond à votre répertoire temporaire. Ce qui est problématique si vous souhaitez utiliser l'emplacement exact de l'exécutable afin d'accéder à des ressources statiques livrées avec le programme. Comme un fichier de configuration qui serait dans le même répertoire que l'exécutable. Pour résoudre ce problème, je vous conseille de lire un de mes articles qui explique comment faire.

Le package flag

Les drapeaux de ligne de commande (ou flags) permettent de spécifier les options des programmes via la ligne de commande. Par exemple, si on tape la ligne de commande suivante : ls -l, on comprend que -l est une option du programme ls.

La bibliothèque standard de go fournit un support des options de ligne de commande ayant les fonctionnalités suivantes :
  1. Documenter les options (documentation que l'on peut afficher avec l'option -h).
  2. Fixer une valeur par défaut pour chacune des options.
  3. Gérer les options inexistantes (non supportées pas le programme)

Exemple de code

On peut déclarer une option de type string, integer ou bool. Les valeurs receuillies par la fonction flag.Parse sont accessibles par leur référence (ce sont des pointeurs et pas des valeurs). Voici un exemple de code :
package main

import (
	"flag"
	"fmt"
)

func main() {
    mot := flag.String("mot", "rien", "N'importe quel mot")
    nombre := flag.Int("nombre", 0, "Un entier")
	commutateur := flag.Bool("commutateur", false, "Un commutateur")
    flag.Parse()

    fmt.Println("Vous avez choisi le mot :", *mot)
    fmt.Println("Vous avez choisi le nombre :", *nombre)
	fmt.Println("Est-ce vous voulez le faire ?", *commutateur)
	fmt.Println("Tous les autres arguments :", flag.Args())
}

Option Aide (-h)

Avec l'exemple de code que nous venons d'écrire, on comprend que lorsque l'on déclare une option, on décrit son type, sa valeur par défaut ainsi que sa description. Ces éléments permettent de définir une aide sur les options disponibles à l'aide du commutateur -h, par exemple :
flags -h
Usage of flags
  -commutateur=false: Un commutateur
  -mot="rien": N'importe quel mot
  -nombre=0: Un entier

Options non définies

Si vous utilisez une option qui n'est pas définie, le programme affichera un message d'erreur et le texte d'aide :
flag provided but not defined: -too
Usage of flags
  -commutateur=false: Un commutateur
  -mot="rien": N'importe quel mot
  -nombre=0: Un entier

Autres paramètres à droite des options définies

Pour utiliser tous les autres arguments que vous n'avez pas décrits comme étant un flag, utilisez le code suivant :
    fmt.Println("Tous les autres arguments :", flag.Args())
Ce code fonctionne sans erreur à la condition que vous ayez fourni toutes les autres options.

Étiquettes :   os   debuter 
Portrait de Benjamin BALET
Benjamin BALET
Consultant APM

Retrouvez mes cooordonées

Benjamin BALET sur viadeo






Vous aimerez aussi

Les lois de la réflexion

Une traduction du blog officiel de golang expliquant le mécanisme de la réflexion en Go.   Lire »

Gobs le format natif d'échange de données en Go

Traduction d'un article du blog officiel expliquant comment échanger des données entre deux programmes golang grâce à un format natif   Lire »

Comment écrire du code Go ?

Traduction d'une partie des spécifications officielles du langage Go, cet article explique comment développer en Go.   Lire »

Comment gérer efficacement les erreurs en golang ?

Préconisations officielles pour la gestion des erreurs dans un programme golang. Cet article complète les explications sur panic, defer et recover   Lire »

Tests unitaires automatisés et couverture de test en go

Comment obtenir un rapport sur la couverture du code par les tests unitaires en golang ? Un exemple de code et de cas de test.   Lire »

Commentaires

Soyez le premier à commenter cet article

Publier un commentaires

Tous les commentaires sont soumis à modération. Les balises HTML sont pour la plupart autorisées. Les liens contextuels et intéressants sont en follow.

(requis)
(requis)
(requis, mais non publié)
(recommandé si vous souhaitez être publié)