Go tương đương với argv [0] là gì?


103

Làm cách nào để lấy tên chương trình của chính tôi trong thời gian chạy? Go tương đương với argv [0] của C / C ++ là gì? Đối với tôi, việc tạo ra cách sử dụng với tên phù hợp sẽ rất hữu ích.

Cập nhật: đã thêm một số mã.

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
Thay vì phát hiện chiều dài của flag.Args()ở đây bạn có thể sử dụngflag.NArg()
Keith Smiley

2
Câu trả lời đúng là os.Args[], không flag.Args(). Gói cờ dùng để phân tích cú pháp các đối số dòng lệnh như -this -thatflag.Args()trả về các đối số còn lại chưa được phân tích cú pháp. Đây là một ví dụ: play.golang.org/p/_YtTcqLWnl
fiorix

Câu trả lời:


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

Đối số được đưa ra trong osgói http://golang.org/pkg/os/#Variables

Nếu bạn định xử lý đối số, flaggói http://golang.org/pkg/flag là cách ưu tiên. Cụ thể cho trường hợp của bạnflag.Usage

Cập nhật cho ví dụ bạn đã đưa ra:

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

nên làm thủ thuật


Tôi không thể tìm ra cách lấy nó trong cờ và không biết os có thông tin đó. Cảm ơn.
grokus

1
cảnh báo - không sử dụng kỹ thuật này nếu bạn đang gọi một chương trình thông qua "go run", bạn sẽ nhận được a.out được tạo tự động.
Brad Clawsie

11
@bradclawsie bạn nhận được a.out vì đó là tên của tệp thực thi, hành vi vẫn đúng.
cthom06,

16

sử dụng os.Args[0]từ os gói

package main
import "os"
func main() {
    println("I am ", os.Args[0])
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.