Go解析命令列引數 flag包

2021-08-25 14:08:49 字數 2440 閱讀 2986

在寫命令列程式(工具、server)時,對命令列引數進行解析,是一種常見的需求。各種語言一般都會提供相應的方法或庫,以方便開發者使用。在go標準庫中提供了乙個包:flag,方便進行命令列解析。也就是說,go的flag包用來解析命令列引數。 

命令列flag的語法有如下三種形式:

-flag // 只支援bool型別

-flag=x

-flag x // 只支援非bool型別

其中,第一種形式只能用於bool型別。第三種形式只能用於非bool型別的flag。

第三種形式只能用於非bool型別的原因是:對於這樣的命令 cmd -x *,如果有乙個檔案名字是:0或false等,則命令的原意會改變。因為bool型別支援-flag這種形式,所以go語言在parse()方法中對bool型別進行了特殊處理。預設的,若提供了-flag,則對應的值為true;否則,則為flag.bool/boolvar中指定的預設值;如果希望顯示地設定為false,則使用-flag=false。

定義flags有兩種方式:

1)flag.***(),其中***可以是int、string等;返回乙個相應型別的指標,如:

var ip = flag.int("flagname", 123, "int flag for flagname")
2)flag.***var(),將flag繫結到乙個變數上,如:

var flagvar int

flag.intvar(&flagvar, "flagname", 123, "int flag for flagname")

另外,還可以建立自定義flag,只要實現flag.value介面即可(要求receiver是指標),這時候可以通過如下方式定義該flag:

flag.var(&flagval, "name", "help message for flagname")
例如,解析以英文逗號分割的字串直接到 slice 中,我們可以定義如下 value:

type slicevalue string

func newslicevalue(vals string, p *string) *slicevalue

func (s *slicevalue) set(val string) error

func (s *slicevalue) get() inte***ce{}

func (s *slicevalue) string() string

之後,可以這麼使用:

var languages string

flag.var(newslicevalue(string{}, &languages), "slice", "i like programming `languages`")

這樣通過 -slice 「go,php」 這樣的形式傳遞引數,languages 得到的就是 [go, php]。flag 包中對 duration 這種非基本型別的支援,使用的就是類似這樣的方式。

我們常用的api如下:

1. 直接獲取命令列引數

// 獲取名字為name的引數值,預設值為value,用法為usage

// 注意返回值是乙個指標

// 類似的方法還有 int(),bool()等。

func string(name string, value string, usage string) *string

2. 將獲取的命令列引數賦給指定值

// 這種方式p作為返回值,可以傳入變數的位址

// 類似的方法還有 intvar(),boolvar()等。

func stringvar(p *string, name string, value string, usage string)

3. 展示使用方法

// usage用來列印用法

var usage = func()

4. 解析引數

// 解析引數,應在設定完引數變數後呼叫

func parse()

**示例:

ackage main

import (

"flag"

"fmt"

// "os"

)func main()

執行示例如下:

$ go run flag.go -ok -id 11111 -port 8899 -name testuser very good

ok: true

id: 11111

port: 8899

name: testuser

other: [very good]

Go 用flag包解析命令列引數

flag包能解析的引數有如下四種形式,使用的時候分三種型別 型別一 cmd flag x 支援所有型別 cmd flag x 只支援非bool型別 型別二 cmd flag 只支援bool型別 型別三 cmd abc 沒有flag的引數 cmd flag x cmd flag x 只支援非bool型...

go 命令列解析工具包flag

在學習用go寫乙個jvm的時候,看到乙個go解析命令列的工具包flag包,記錄一下 flag包有兩種方式 1 flag.其中 可以是int string等 返回乙個相應型別的指標,如 cpvalue flag.strin ar cp classpath 第乙個引數cp是名字 第二個引數是預設值 第三...

Golang 使用flag包進行命令列引數解析

最近在使用go開發cli command line inte ce 時,通過對於官方文件以及他人部落格的學習,在此寫下個人認為更適合自己往後回顧的關於flag的使用說明。package main import fmt flag func main 從main往下看 第一句代表我們需要乙個w的命令列引...