【Golang】如何讀取 command-line argument/flag?必知的幾種用法!

Zam Huang
4 min readAug 31, 2019

--

前言

其實這種文章挺多的,不過大部分都是英文跟簡體,有些也描述太過繁雜,Zam 想要寫一個簡單的範例幫助大家,用最短的時間知道必用的幾個用法。另外 flag 雖然可以在讀取 argument 直接透過 struct 初始自己的物件,但是這屬於比較高階用法,一般人不會用到這邊就不做解釋。

使用率最高,必知用法

func PrintDefaults

可以印出已經設定好的指令。如果你想要更多關於你撰寫的 cmd 提示,不只有設定的指令,通常會與 Usage 做搭配。詳細可以透過以下範例達成

flag.Usage = usage
func usage() {
fmt.Fprintf(os.Stderr, "Usage: math [options] [root]\n")
fmt.Fprintf(os.Stderr, " Currently, there are four URI routes could be used:\n")
flag.PrintDefaults()
}

func Parse

會把 command line 的 argument 變成你所 define 的變數,對於不同形式的 bind 會再以下做解釋。

func Arg

可以拿取未指定的 value,例如 3, 4

math -o "*" -p=true 3 4flag.Arg(0) // get 3
flag.Arg(1) // get 4

func Args

可以一次拿取所有的 Arg(),根據情境可以決定使用 Arg(int) 或 Args()

math -o "*" -p=true 3 4len(flag.Args()) // get 2
flag.Args()[0] // get 3

func StringVar

基本上每個 primary type 都有這兩種 func,例如 int, bool 等等。這兩個其實沒有太大的差異,都可以達到一樣的目的,只是儲存方式不同,所以呼叫上有點不同。

StringVar 透過 bind 將 argument 綁在一起

var operator string
flag.StringVar(&operator, “o”, “+”, “the math `operator`”)
fmt.Printfln(operator) // +

func String

String 透過 pointer 將 argument 綁在一起

var operator *string
operator = flag.String("o", "+", "the math `operator`")
fmt.Printfln(operator) // 0xc00001a0b8
fmt.Printfln(*operator) // +

範例程式碼

使用範例

math -o “*” -p=true 3 4或者math -o=“*” -p=true 3 4// 結果
3 * 4 = 12

輸入 -help or -h 看使用說明

math -hUsage: math [options] [root]
Currently, there are four URI routes could be used:
-o operator
the math operator (default "+")
-p show
show process

References

如果此篇你喜歡或覺得有幫助

可以幫 Zam 快速連點個鼓掌(claps) 或者 follow 哦

萬分感謝!

--

--

Zam Huang
Zam Huang

Written by Zam Huang

一個記錄著自己人生過程的工程師。A Software Engineer at Ruckus Network in Taiwan。 IG, Linkedin:@zam_huang, stack overflow: user:2613194

Responses (1)