92 votes

Comment accéder aux arguments de la ligne de commande passés à un programme Go ?

Comment accéder aux arguments de la ligne de commande en Go ? Ils ne sont pas passés comme arguments à main .

Un programme complet, éventuellement créé en liant plusieurs paquets, doit avoir un paquet appelé main, avec une fonction

func main() { ... }

défini. La fonction main.main() ne prend aucun argument et ne renvoie aucune valeur.

0 votes

Je regarderais flag module Golang intégré. Il rend l'analyse des os.Args un peu plus facile

0 votes

De plus, en ce qui concerne le "ne renvoie aucune valeur", notez que vous pouvez appeler os.Exit() pour retourner un code de sortie spécifique au processus appelant.

118voto

peterSO Points 25725

Vous pouvez accéder aux arguments de la ligne de commande en utilisant la commande os.Args variable. Par exemple,

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println(len(os.Args), os.Args)
}

Vous pouvez également utiliser le paquet de drapeaux qui implémente l'analyse des drapeaux de la ligne de commande.

12voto

No Name Points 716

Drapeau est un bon paquet pour cela.

package main

// Go provides a `flag` package supporting basic
// command-line flag parsing. We'll use this package to
// implement our example command-line program.
import "flag"
import "fmt"

func main() {

    // Basic flag declarations are available for string,
    // integer, and boolean options. Here we declare a
    // string flag `word` with a default value `"foo"`
    // and a short description. This `flag.String` function
    // returns a string pointer (not a string value);
    // we'll see how to use this pointer below.
    wordPtr := flag.String("word", "foo", "a string")

    // This declares `numb` and `fork` flags, using a
    // similar approach to the `word` flag.
    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    // It's also possible to declare an option that uses an
    // existing var declared elsewhere in the program.
    // Note that we need to pass in a pointer to the flag
    // declaration function.
    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    // Once all flags are declared, call `flag.Parse()`
    // to execute the command-line parsing.
    flag.Parse()

    // Here we'll just dump out the parsed options and
    // any trailing positional arguments. Note that we
    // need to dereference the pointers with e.g. `*wordPtr`
    // to get the actual option values.
    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

11voto

Maurice Gilden Points 1363

Les arguments de la ligne de commande se trouvent dans os.Args . Dans la plupart des cas, cependant, le paquet drapeau est meilleur car il fait l'analyse des arguments pour vous.

8voto

Benyamin Jafari Points 2126

Réponse rapide :

package main

import ("fmt"
        "os"
)

func main() {
    argsWithProg := os.Args
    argsWithoutProg := os.Args[1:]
    arg := os.Args[3]
    fmt.Println(argsWithProg)
    fmt.Println(argsWithoutProg)
    fmt.Println(arg)
}

Test : $ go run test.go 1 2 3 4 5

Dehors :

[/tmp/go-build162373819/command-line-arguments/_obj/exe/modbus 1 2 3 4 5]
[1 2 3 4 5]
3

NOTE : os.Args permet d'accéder aux arguments bruts de la ligne de commande. Notez que la première valeur de cette tranche est le chemin d'accès au programme, et os.Args[1:] contient les arguments du programme. Référence

7voto

C.. Points 10739

La réponse de Peter est exactement ce dont vous avez besoin si vous voulez juste une liste d'arguments.

Toutefois, si vous recherchez une fonctionnalité similaire à celle présente sous UNIX, vous pouvez utiliser la fonction aller à la mise en œuvre de docopt . Vous pouvez l'essayer aquí .

docopt renverra du JSON que vous pourrez ensuite traiter à votre guise.

1 votes

Peut-être que "besoin" est un mot trop fort. Recommandez "alors vous pourriez".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X