英語(yǔ)機(jī)構(gòu)網(wǎng)站建設(shè)方案足球進(jìn)球排行榜
Go命令行參數(shù)操作:os.Args、flag包
最近在寫項(xiàng)目時(shí),需要用到命令行傳入的參數(shù),正好借此機(jī)會(huì)整理一下。
1 os.Args:程序運(yùn)行時(shí),攜帶的參數(shù)(包含exe本身)
package mainimport ("fmt""os""strconv"
)func main () {for idx, args := range os.Args {fmt.Println("參數(shù)" + strconv.Itoa(idx) + ":", args)}
}
運(yùn)行之后的結(jié)果:
$go run main.go 1 3 -X ?
參數(shù)0: /tmp/go-build116558042/command-line-arguments/_obj/exe/main
參數(shù)1: 1
參數(shù)2: 3
參數(shù)3: -X
參數(shù)4: ?
可以看到,命令行參數(shù)包括了程序路徑本身,以及通常意義上的參數(shù)。
程序中os.Args的類型是 []string ,也就是字符串切片。所以可以在for循環(huán)的range中遍歷,還可以用 len(os.Args) 來(lái)獲取其數(shù)量。
如果不想要輸出os.Args的第一個(gè)值,也就是可執(zhí)行文件本身的信息,可以修改上述程序:
for idx, args := range os.Args[1:] {
將range后面的切片,去掉第一個(gè)元素。
輸出切片的所有元素,還有更簡(jiǎn)潔的方式:
fmt.Println(strings.Join(os.Args[1:], "\n"))
fmt.Println(os.Args[1:])
/*
后一種方式的結(jié)果是[1 3 -X ?],這是fmt.Println輸出切片的格式
*/
2 flag包:解析自定義參數(shù)
2.1 定義參數(shù):flag.String(name,defaultValue,usage)
使用flag包,首先定義待解析命令行參數(shù),也就是以"-"開頭的參數(shù),比如這里的 -b -s -help等。-help不需要特別指定,可以自動(dòng)處理。
這里指定了兩個(gè)參數(shù),-b和-s:
var b = flag.Bool("b", false, "bool類型參數(shù)")
var s = flag.String("s", "", "string類型參數(shù)")-----------------
原型:
func Bool(name string, value bool, usage string) *bool
func String(name string, value string, usage string) *string
通過flag.Bool和flag.String,建立了2個(gè)指針b和s,分別指向bool類型和string類型的變量。所以后續(xù)要通過 *b 和 *s 使用變量值。
flag.Bool和flag.String的參數(shù)有3個(gè),分別是命令行參數(shù)名稱,默認(rèn)值,提示字符串。
2.2 解析參數(shù):flag.Parse()
使用之前必須要解析,否則會(huì)獲取不到參數(shù)具體的值
//解析參數(shù)
flag.Parse()
2.3 獲取參數(shù)的值
通過*號(hào)+參數(shù)名獲取解析后的參數(shù)值
①已經(jīng)定義過的參數(shù):*paramName直接取值
上文已經(jīng)說(shuō)明,通過flag方法定義好的參數(shù)變量指針,通過間接引用操作即可使用其內(nèi)容:
fmt.Println("-b:", *b)
fmt.Println("-s:", *s)
②未定義的參數(shù):flag.Args(),獲取剩下參數(shù)(字符切片)
參數(shù)中沒有能夠按照預(yù)定義的參數(shù)解析的部分,通過flag.Args()即可獲取,是一個(gè)字符串切片。
fmt.Println("其他參數(shù):", flag.Args())
需要注意的是,從第一個(gè)不能解析的參數(shù)開始,后面的所有參數(shù)都是無(wú)法解析的。即使后面的參數(shù)中含有預(yù)定義的參數(shù):
$ go run main.go -b stop -s test others
-b: true
-s:
其他參數(shù): [stop -s test others]
2.4 案例
package mainimport ("flag""fmt"
)func main() {var uname = flag.String("username", "ziyi", "the user name")var age = flag.Int("age", 18, "the user age")flag.Parse()//①情況一:帶參數(shù)// ./main -username tom -age 22//解析后的結(jié)果:parse after, uname= tom age= 22//②情況二:不帶參數(shù),但是因?yàn)槲覀兌x了默認(rèn)值,因此參數(shù)會(huì)被賦上默認(rèn)值// ./main//解析后:parse after, uname= ziyi age= 18fmt.Println("parse after, uname=", *uname, " age=", *age)}
參考:https://blog.csdn.net/guanchunsheng/article/details/79612153