Go เทียบเท่ากับ argv [0] เท่าไหร่


103

ฉันจะตั้งชื่อโปรแกรมของตัวเองที่รันไทม์ได้อย่างไร? อะไรที่เทียบเท่ากับ 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]);
    // ...
}

2
แทนที่จะตรวจจับความยาวตรงflag.Args()นี้คุณสามารถใช้ได้flag.NArg()
Keith Smiley

2
คำตอบที่ถูกต้องคือไม่os.Args[] flag.Args()แพ็กเกจแฟล็กมีไว้สำหรับการแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งเช่น-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)
}

ควรทำเคล็ดลับ


ฉันคิดไม่ออกว่าจะตั้งค่าสถานะอย่างไรและไม่รู้ว่าระบบปฏิบัติการมีข้อมูลนั้น ขอบคุณ.
grokus

1
คำเตือน - อย่าใช้เทคนิคนี้หากคุณเรียกใช้โปรแกรมผ่าน "go run" คุณจะได้รับ a.out ที่สร้างขึ้นโดยอัตโนมัติ
Brad Clawsie

11
@bradclawsie คุณจะได้รับ a.out เพราะนั่นคือชื่อของไฟล์ปฏิบัติการพฤติกรรมยังคงถูกต้อง
cthom06

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.