1.命令行參數(命令行參數是指定程序運行參數的一個常見方式。例如,go run hello.go,程序 go 使用了 run 和 hello.go 兩個參數。)
package main import "os" import "fmt" func main() { //os.Args 提供原始命令行參數訪問功能。注意,切片中的第一個參數是該程序的路徑,並且 os.Args[1:]保存所有程序的的參數。 argsWithProg := os.Args argsWithoutProg := os.Args[1:] //你可以使用標准的索引位置方式取得單個參數的值。 arg := os.Args[3] fmt.Println(argsWithProg) fmt.Println(argsWithoutProg) fmt.Println(arg) } /* 要實驗命令行參數,最好先使用 go build 編譯一個可執行二進制文件 $ go build command-line-arguments.go $ ./command-line-arguments a b c d [./command-line-arguments a b c d] [a b c d] c */
2.命令行標志(使用標記的命令行處理方法,命令行標志是命令行程序指定選項的常用方式。例如,在 wc -l 中,這個 -l 就是一個命令行標志。)
package main //Go 提供了一個 flag 包,支持基本的命令行標志解析。我們將用這個包來實現我們的命令行程序示例。 import "flag" import "fmt" func main() { //基本的標記聲明僅支持字符串、整數和布爾值選項。這里我們聲明一個默認值為 "foo" 的字符串標志 word並帶有一個簡短的描述。這里的 flag.String 函數返回一個字符串指針(不是一個字符串值),在下面我們會看到是如何使用這個指針的。 wordPtr := flag.String("word", "foo", "a string") //使用和聲明 word 標志相同的方法來聲明 numb 和 fork 標志。 numbPtr := flag.Int("numb", 42, "an int") boolPtr := 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:", *boolPtr) fmt.Println("svar:", svar) fmt.Println("tail:", flag.Args()) } /* 測試這個程序前,最好將這個程序編譯成二進制文件,然后再運行這個程序。 $ go build command-line-flags.go 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 trailing: [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: ... */
