Apa padanan Go dengan argv [0]?

103

Bagaimana cara mendapatkan nama program saya sendiri saat runtime? Apa padanan Go dengan argv [0] C / C ++? Bagi saya, berguna untuk menghasilkan penggunaan dengan nama yang tepat.

Pembaruan: menambahkan beberapa kode.

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.dll
sumber
2
Alih-alih mendeteksi panjangnya flag.Args()Anda bisa menggunakanflag.NArg()
Keith Smiley
2
Jawaban yang benar adalah os.Args[]tidak flag.Args(). Paket flag adalah untuk mengurai argumen baris perintah seperti -this -that, dan flag.Args()mengembalikan argumen tersisa yang tidak diurai. Berikut ini contohnya: play.golang.org/p/_YtTcqLWnl
fiorix

Jawaban:

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

Argumen diekspos dalam ospaket http://golang.org/pkg/os/#Variables

Jika Anda akan melakukan penanganan argumen, flagpaket http://golang.org/pkg/flag adalah cara yang lebih disukai. Khusus untuk kasus Andaflag.Usage

Pembaruan untuk contoh yang Anda berikan:

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

harus melakukan triknya

cthom06
sumber
Saya tidak tahu bagaimana mendapatkannya di flag dan tidak tahu os memiliki informasi itu. Terima kasih.
grokus
1
peringatan - jangan gunakan teknik ini jika Anda menjalankan program melalui "go run", Anda akan mendapatkan a.out yang dibuat secara otomatis.
Brad Clawsie
11
@bradclawsie Anda mendapatkan a.out karena itulah nama yang dapat dieksekusi, perilakunya masih benar.
cthom06
16

gunakan os.Args[0]dari paket os

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