Что в Go эквивалентно argv [0]?

103

Как я могу получить имя моей собственной программы во время выполнения? Что в Go является эквивалентом argv [0] C / C ++? Для меня полезно создать использование с правильным именем.

Обновление: добавлен код.

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
источник
2
Вместо определения длины flag.Args()здесь вы можете использоватьflag.NArg()
Кейт Смайли
2
Правильный ответ - os.Args[]нет flag.Args(). Пакет flag предназначен для анализа аргументов командной строки, таких как -this -that, и flag.Args()возвращает оставшиеся аргументы, которые не анализируются. Вот пример: play.golang.org/p/_YtTcqLWnl
fiorix

Ответы:

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

Аргументы представлены в osпакете http://golang.org/pkg/os/#Variables

Если вы собираетесь обрабатывать аргументы, предпочтительнее использовать flagпакет http://golang.org/pkg/flag . Специально для вашего случаяflag.Usage

Обновление для приведенного вами примера:

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

должен сделать трюк

cthom06
источник
Я не мог понять, как добавить его во флаг, и не знал, что в ОС есть такая информация. Спасибо.
Grokus
1
предупреждение - не используйте эту технику, если вы вызываете программу через "go run", вы получите автоматически сгенерированный a.out.
Брэд Клоси, 03
11
@bradclawsie вы получите a.out, потому что это имя исполняемого файла, поведение по-прежнему правильное.
cthom06 04
16

использовать os.Args[0]из пакета ОС

package main
import "os"
func main() {
    println("I am ", os.Args[0])
}
нет
источник