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]);
    // ...
}

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


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])
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.