以身作則:命令列旗標

命令列旗標是指定命令列程式選項的一種常見方式。例如,在「wc -l」中,-l 就是一個命令列旗標。

package main

Go 提供一個支援基本的命令列旗標分析的「flag」套件。我們將使用這個套件實作範例命令列程式。

import (
    "flag"
    "fmt"
)
func main() {

基本旗標宣告可用於字串、整數和布林值選項。在此,我們宣告一個預設值為「foo」且具有簡短描述的 word 字串旗標。這個「flag.String」函式回傳一個字串指標(不是字串值);我們將在下方說明如何使用這個指標。

    wordPtr := flag.String("word", "foo", "a string")

這會採用類似 word 旗標的作法,宣告 numb 和 fork 旗標。

    numbPtr := flag.Int("numb", 42, "an int")
    forkPtr := flag.Bool("fork", false, "a bool")

還能宣告一個選項,使用程式碼中其他地方已宣告的現有變數。請注意,我們需要傳遞一個指標給旗標宣告函式。

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

一旦所有旗標都宣告完畢,請呼叫「flag.Parse()」來執行命令列分析。

    flag.Parse()

在此,我們只會將分析的選項和任何尾隨的位置引數傾印出來。請注意,我們需要透過例如 *wordPtr 解除指標來取得實際選項值。

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *forkPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

若要嘗試命令列旗標程式,最好先編譯它,然後直接執行產生的二進位檔。

$ go build command-line-flags.go

透過先為所有旗標提供值,來試用建置的程式。

$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

請注意,如果您略過旗標,它們會自動採用其預設值。

$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

任何尾隨的位置引數都可以在任何旗標之後提供。

$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

請注意,「flag」套件要求所有旗標出現在位置引數之前(否則旗標會被解譯為位置引數)。

$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

使用 -h 或 --help 旗標,可為命令列程式取得自動產生的說明文字。

$ ./command-line-flags -h
Usage of ./command-line-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

如果您提供一個未指定給「flag」套件的旗標,該程式會印出一個錯誤訊息,並再次顯示說明文字。

$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...

下一個範例:命令列子命令