Was ist Go's Äquivalent zu argv [0]?

103

Wie kann ich zur Laufzeit den Namen meines eigenen Programms erhalten? Was ist Go's Äquivalent zu C / C ++ 's argv [0]? Für mich ist es nützlich, die Verwendung mit dem richtigen Namen zu generieren.

Update: Code hinzugefügt.

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
quelle
2
Anstatt die Länge von flag.Args()hier zu ermitteln, könnten Sie verwendenflag.NArg()
Keith Smiley
2
Die richtige Antwort ist os.Args[]nicht flag.Args(). Das Flag-Paket dient zum Parsen von Befehlszeilenargumenten wie -this -thatund flag.Args()gibt die verbleibenden Argumente zurück, die nicht analysiert wurden. Hier ist ein Beispiel: play.golang.org/p/_YtTcqLWnl
fiorix

Antworten:

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

Argumente sind im osPaket http://golang.org/pkg/os/#Variables verfügbar

Wenn Sie Argumente flagbearbeiten möchten, ist das Paket http://golang.org/pkg/flag der bevorzugte Weg. Speziell für Ihren Fallflag.Usage

Update für das Beispiel, das Sie gegeben haben:

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

sollte den Trick machen

cthom06
quelle
Ich konnte nicht herausfinden, wie ich es in die Flagge bekommen konnte und wusste nicht, dass OS diese Informationen hat. Vielen Dank.
Grokus
1
Warnung - Verwenden Sie diese Technik nicht, wenn Sie ein Programm über "go run" aufrufen. Sie erhalten das automatisch generierte a.out.
Brad Clawsie
11
@bradclawsie Sie erhalten a.out, weil das der Name der ausführbaren Datei ist, das Verhalten ist immer noch korrekt.
cthom06
16

Verwendung os.Args[0]aus dem OS- Paket

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