Quel est l'équivalent Go de argv [0]?

103

Comment puis-je obtenir le nom de mon propre programme lors de l'exécution? Quel est l'équivalent de Go de argv [0] de C / C ++? Pour moi, il est utile de générer l'utilisation avec le bon nom.

Mise à jour: ajout de code.

package main

import (
    "flag"
    "fmt"
    "os"
)

func usage() {
    fmt.Fprintf(os.Stderr, "usage: myprog [inputfile]\n")
    flag.PrintDefaults()
    os.Exit(2)
}

func main() {
    flag.Usage = usage
    flag.Parse()

    args := flag.Args()
    if len(args) < 1 {
        fmt.Println("Input file is missing.");
        os.Exit(1);
    }
    fmt.Printf("opening %s\n", args[0]);
    // ...
}
Grokus
la source
2
Au lieu de détecter la longueur d' flag.Args()ici, vous pourriez utiliserflag.NArg()
Keith Smiley
2
La bonne réponse est os.Args[]non flag.Args(). Le package d'indicateur sert à analyser les arguments de ligne de commande comme -this -that, et flag.Args()renvoie les arguments restants qui ne sont pas analysés. Voici un exemple: play.golang.org/p/_YtTcqLWnl
fiorix

Réponses:

145
import "os"
os.Args[0] // name of the command that it is running as
os.Args[1] // first command line parameter, ...

Les arguments sont exposés dans le ospackage http://golang.org/pkg/os/#Variables

Si vous allez gérer les arguments, le flagpackage http://golang.org/pkg/flag est le moyen préféré. Spécifiquement pour votre casflag.Usage

Mettez à jour l'exemple que vous avez donné:

func usage() {
    fmt.Fprintf(os.Stderr, "usage: %s [inputfile]\n", os.Args[0])
    flag.PrintDefaults()
    os.Exit(2)
}

devrait faire l'affaire

cthom06
la source
Je ne pouvais pas comprendre comment le mettre en drapeau et je ne savais pas que os avait cette information. Merci.
grokus
1
avertissement - n'utilisez pas cette technique si vous invoquez un programme via "go run", vous obtiendrez le fichier a.out généré automatiquement.
Brad Clawsie
11
@bradclawsie vous obtenez a.out car c'est le nom de l'exécutable, le comportement est toujours correct.
cthom06
16

utiliser à os.Args[0]partir du package os

package main
import "os"
func main() {
    println("I am ", os.Args[0])
}
nos
la source