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

88

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

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

func main() { ... }

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

Oleg Razgulyaev
la source
Je regarderais le flagmodule Golang intégré. Cela rend l'analyse os.Argsun peu plus facile
Matej
Aussi, re: le "retourne aucune valeur", notez que vous pouvez appeler os.Exit()pour renvoyer un code de sortie spécifique au processus appelant.
Mark Reed

Réponses:

113

Vous pouvez accéder aux arguments de la ligne de commande à l'aide de la os.Argsvariable. Par exemple,

package main

import (
    "fmt"
    "os"
)

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

Vous pouvez également utiliser le package d'indicateur , qui implémente l'analyse d'indicateur de ligne de commande.

peterSO
la source
11

Les arguments de ligne de commande peuvent être trouvés dans os.Args . Dans la plupart des cas, l' indicateur de package est meilleur car il analyse les arguments pour vous.

Maurice Gilden
la source
9

Flag est un bon package pour cela.

// [_Command-line flags_](http://en.wikipedia.org/wiki/Command-line_interface#Command-line_option)
// are a common way to specify options for command-line
// programs. For example, in `wc -l` the `-l` is a
// command-line flag.

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())
}
BufBills
la source
1
Looks copie de Go by Examples
Grijesh Chauhan
7

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

Cependant, si vous recherchez des fonctionnalités similaires à celles présentes sous UNIX, vous pouvez utiliser l' implémentation go de docopt . Vous pouvez l'essayer ici .

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

Carl
la source
1
Peut-être que le besoin est un mot trop fort. Recommander "alors vous pourriez".
Matt Joiner
7

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)
}

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

En dehors:

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

REMARQUE : os.Argsdonne accès aux arguments de ligne de commande bruts. 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

Benyamin Jafari
la source
0

vous pouvez utiliser le package d'indicateur Golang par exemple,

package main

import (
    "flag"
    "fmt"
)

func main() {

    wordPtr := flag.String("word", "default value", "a string for description")
    flag.Parse()
    fmt.Println("word:", *wordPtr)

}

appel avec cli

 go run main.go -word=hello
 
 

production

word: hello
dılo sürücü
la source