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

2021-08-09 10:19:04 字數 1847 閱讀 4179

最近在使用go開發cli(command-line-inte***ce)時,通過對於官方文件以及他人部落格的學習,在此寫下個人認為更適合自己往後回顧的關於flag的使用說明。

package main

import (

"fmt"

"flag"

)func main()

}

從main往下看:第一句代表我們需要乙個w的命令列引數,這個引數接收int型別的值。第二句同理,只是int換成了string。緊跟後面的0是我們設定的預設值,demo test則是我們給這個引數作用的說明,可以通過呼叫 flag.usage() 看到。flag.parse()代表我們開始解析引數,在parse以後,我們是不允許再新增引數的,也就是說,我們不能寫了parse之後再寫乙個flag.int()。flag.narg()用來輸出non-flag引數的個數。在講non-flag前,我們先看命令列標籤格式:

-flag

-flag=x

-flag x // 只有非boolean標籤能這麼用

// 減號可以使用乙個或者兩個,效果是一樣的。

一般而言,我們定義了的引數便是flag引數,使用的形式便是上述形式。而我們沒有定義的,又沒有使用上述格式的,我們一般便稱其為non-flag引數。可能有人有疑問,以demo0**為例,那 -p 應該算作什麼?這裡要分兩種情況:

go run demo0.go -w 10 -a hahaha -p start

此時的-p便為已使用但是未定義的flag引數

go run demo0.go -w 10 -a hahaha start -p 666

此時的-p便是non-flag引數。此時的重點就是,flag引數的解析在碰到第乙個non-flag引數便會停止,即從第乙個non-flag開始,後面出現的所有引數都將被認為是non-flag,不論你是否符合要求的命令列標籤格式。所以,以上述命令為例,non-flag引數有三個 :start 、 -p、666,所以如果你希望在non-flag後面仍然能像在non-flag之前一般處理(比如把666賦給p),可能需要做更多額外的處理工作才能完成。

package main

import (

"fmt"

"flag"

)func main()

上述demo目的在於講明flag.***var 與 flag.*** 間的區別。通過官方文件可以獲悉,flag.***var需要你傳入乙個指標作為引數,而flag.***則是返回乙個指標值。具體應用場景大家見仁見智。於我個人而言,如果所需引數的作用是全域性的,我會選擇使用flag.***var繫結到乙個全域性變數之上,如果只是區域性作用,比如作為後續行為的乙個選擇條件之一,那麼一般我會採用flag.***的形式

package main

import (

"fmt"

"flag"

"os"

)func main()

}func usage()

這裡主要講解flag.usage()的使用,實際上這個函式便是將我們定義引數時寫的關於引數的說明進行輸出。一般而言,此函式一般在使用者使用錯誤時作為提示給出。根據文件,flag.usage() 預設 輸出到 os.stderr。我們也可以將之用自己的函式替代,從而打造更加個性化的提示。

實際上結合上述demo已經能夠簡單的利用flag進行引數解析,如果希望追求更為複雜使用的使用方式,不建議使用flag包,不妨看看pflag或者goptions,相信你能有更加棒的收穫。

golang之flag包詳解

在golang中有很多方法來處理命令列引數,簡單情況下可以不使用任何庫,直接使用os.args 但是golang標準庫提供了flag包來處理命令列引數 還有第三方提供的處理命令列引數的庫cobra cli。flag包繫結解析引數有三種定義方式 flag.例如 flag.int,flag.string...

快速理解golang標準庫flag包

flag包實現了命令列引數的解析 基本分為三步 package main import flag fmt os var 1.使用flag.string bool int 等函式註冊flag,解析後儲存到bool,int,string型別的指標 n flag.int n 1,print times s...

Go語言flag包使用

flag包提供了一系列解析命令列引數的功能介面 命令列語法主要有以下幾種形式 flag 只支援bool型別 flag x flag x 只支援非bool型別以上語法對於乙個或兩個 號,效果是一樣的,但是要注意對於第三種情況,只支援非bool型別,原因是碰到如下情況時 cmd x 為0,false有可...