2010-07-28 8 views
82

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

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 de ' flag.Args() 'ici vous pouvez utiliser [' flag.NArg() '] (http://golang.org/pkg/flag/#NArg) –

+0

La bonne réponse est' o s.Args [] ', pas' flag.Args() '. Le paquetage flag sert à analyser les arguments de la ligne de commande tels que -this -that', et 'flag.Args()' renvoie les arguments restants qui ne sont pas analysés. Voici un exemple: http://play.golang.org/p/_YtTcqLWnl – fiorix

Répondre

116
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 paquet oshttp://golang.org/pkg/os/#Variables

Si vous allez faire la manipulation des arguments, le paquet flaghttp://golang.org/pkg/flag est le meilleur moyen. Plus précisément pour votre cas flag.Usage

Mise à jour pour 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

+0

Je ne pouvais pas comprendre comment l'obtenir dans le drapeau et je ne savais pas que cette information existe. Merci. – grokus

+1

warning - n'utilisez pas cette technique si vous appelez un programme via "go run", vous obtiendrez le a.out autogenerated. –

+8

@bradclawsie vous obtenez un.out parce que c'est le nom de l'exécutable, le comportement est toujours correct. – cthom06

13

utilisation os.Args[0] du paquet os

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