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 -thatvà flag.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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.