日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go内置库模块 flag

發布時間:2024/9/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go内置库模块 flag 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

import "flag"

flag包實現了命令行參數的解析。每個參數認為一條記錄,根據實際進行定義,到一個set集合。每條都有各自的狀態參數。

在使用flag時正常流程:?

1.?通過flag.String(), flag.Bool(), flag.Int()等函數來定義命令行中需要使用的參數。

2.?在定義完flag后,通過調用flag.Parse()來進行對命令行參數的解析。

3.?獲取flag.String(), flag.Bool(), flag.Int()等方法的返回值,即對應用戶輸入的參數.

 注意的是flag.Xxx()返回的值是變量的內存地址,要獲取值時要通過在變量前加*(星號)獲取.

說明:像flag.Int、flag.Bool、flag.String這樣的函數格式都是一樣的,調用的時候需要傳入3個參數 參數的說明如下: 第一個arg表示參數名稱,在控制臺的時候,提供給用戶使用. 第二個arg表示默認值,如果用戶在控制臺沒有給該參數賦值的話,就會使用該默認值. 第三個arg表示使用說明和描述,在控制臺中輸入-arg的時候會顯示該說明,類似-help

可注冊flag類型有:Bool / Int? /? Int64 /? Uint / Uint64 / Float / Float64 / String / Duration / Var

type?Flag

type Flag struct {Name string // flag在命令行中的名字Usage string // 幫助信息Value Value // 要設置的值DefValue string // 默認值(文本格式),用于使用信息 }

Flag類型代表一條flag的狀態

type?FlagSet

type FlagSet struct {// Usage函數在解析flag出現錯誤時會被調用// 該字段為一個函數(而非采用方法),以便修改為自定義的錯誤處理函數Usage func()// 內含隱藏或非導出字段 }

FlagSet代表一個已注冊的flag的集合。FlagSet零值沒有名字,采用ContinueOnError錯誤處理策略。

func?Int

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

Int用指定的名稱、默認值、提示信息注冊一個int類型flag。返回一個保存了該flag的值的指針。

func?IntVar

func IntVar(p *int, name string, value int, usage string)

IntVar用指定的名稱、默認值、使用信息注冊一個int類型flag,并將flag的值保存到p指向的變量。

func?Parse?

func Parse()

從os.Args[1:]中解析注冊的flag。必須在所有flag都注冊好而未訪問其值時執行。未注冊卻使用flag -help時,會返回ErrHelp。

即:將輸入的flag和注冊的flag進行匹配解析

func?Parsed

func Parsed() bool

返回是否Parse已經被調用過。

package mainimport ("flag""fmt" )func main() {married := flag.Bool("married", false, "Are you married?")age := flag.Int("age", 22, "How old are you?")name := flag.String("name", "", "What your name?")var address string//flag.StringVar這樣的函數第一個參數換成了變量地址,后面的參數和flag.String是一樣的。flag.StringVar(&address, "address", "GuangZhou", "Where is your address?")flag.Parse() //解析輸入的參數fmt.Println("輸出的參數married的值是:", *married)//不加*號的話,輸出的是內存地址fmt.Println("輸出的參數age的值是:", *age)fmt.Println("輸出的參數name的值是:", *name)fmt.Println("輸出的參數address的值是:", address) }

從運行結果中可以看出,address參數我們并沒有指定值,則輸出的就是默認值. 另外,-arg后面的=號也不是必須的,可以用空格代替. 如果要查看該程序的所有參數的使用,可以使用-help來查看,如下:

func?PrintDefaults?

func PrintDefaults()

PrintDefault會向標準錯誤輸出寫入所有注冊好的flag的默認值。

func?NFlag

func NFlag() int

NFlag返回已被設置的flag的數量。

func?Lookup

func Lookup(name string) *Flag

返回已經已注冊flag的Flag結構體指針;如果flag不存在的話,返回nil。

func?NArg

func NArg() int

NArg返回解析flag之后剩余參數的個數。

func?Args

func Args() []string

返回解析之后剩下的非flag參數。(不包括命令名).就是無法進行flag匹配的有哪些,

func?Arg

func Arg(i int) string

返回解析之后剩下的第i個參數,從0開始索引。

func?Var

func Var(value Value, name string, usage string)

Var方法使用指定的名字、使用信息注冊一個flag。該flag的類型和值由第一個參數表示,該參數應實現了Value接口。例如,用戶可以創建一個flag,可以用Value接口的Set方法將逗號分隔的字符串轉化為字符串切片。

func?Set

func Set(name, value string) error

設置已注冊的flag的值,修改或者設置

func?Visit

func Visit(fn func(*Flag))

按照字典順序遍歷標簽,并且對每個標簽調用fn。?這個函數只遍歷解析時進行了設置的標簽。[就是執行時提供非默認的值]

func?VisitAll

func VisitAll(fn func(*Flag))

按照字典順序遍歷標簽,并且對每個標簽調用fn。?這個函數會遍歷所有標簽,不管解析時有無進行設置。

package mainimport ("flag""fmt" )func main() {// golang的flag包的一些基本使用方法// 待使用的變量var id intvar name stringvar male bool// 是否已經解析fmt.Println("parsed? = ", flag.Parsed())// 設置flag參數 (變量指針,參數名,默認值,幫助信息)// 也可以用以下帶返回值的方法代替,不過他們返回的是指針,比較麻煩點// Int(name string, value int, usage string) *int// String(name string, value string, usage string) *string// Bool(name string, value bool, usage string) *boolflag.IntVar(&id, "id", 123, "help msg for id")flag.StringVar(&name, "name", "default name", "help msg for name")flag.BoolVar(&male, "male", false, "help msg for male")// 解析flag.Parse()// 是否已經解析fmt.Println("parsed? = ", flag.Parsed())//// 獲取非flag參數fmt.Println(flag.NArg())fmt.Println("------ Args start ------")fmt.Println(flag.Args())for i, v := range flag.Args() {fmt.Printf("arg[%d] = (%s).\n", i, v)}fmt.Println("------ Args end ------")//// visit只包含已經設置了的flagfmt.Println("------ visit flag start ------")flag.Visit(func(f *flag.Flag) {fmt.Println(f.Name, f.Value, f.Usage, f.DefValue)})fmt.Println("------ visit flag end ------")//// visitAll只包含所有的flag(包括未設置的)fmt.Println("------ visitAll flag start ------")flag.VisitAll(func(f *flag.Flag) {fmt.Println(f.Name, f.Value, f.Usage, f.DefValue)})fmt.Println("------ visitAll flag end ------")//// flag參數fmt.Printf("id = %d\n", id)fmt.Printf("name = %s\n", name)fmt.Printf("male = %t\n", male)// flag參數默認值fmt.Println("------ PrintDefaults start ------")flag.PrintDefaults()fmt.Println("------ PrintDefaults end ------")//非flag參數個數fmt.Printf("NArg = %d\n", flag.NArg())// 已設置的flag參數個數fmt.Printf("NFlag = %d\n", flag.NFlag()) } # go run demo2_flag.go -id 234 -name "xx" -male=true p1 p2 p3 parsed? = false parsed? = true 3 ------ Args start ------ [p1 p2 p3] arg[0] = (p1). arg[1] = (p2). arg[2] = (p3). ------ Args end ------ ------ visit flag start ------ id 234 help msg for id 123 male true help msg for male false name xx help msg for name default name ------ visit flag end ------ ------ visitAll flag start ------ id 234 help msg for id 123 male true help msg for male false name xx help msg for name default name ------ visitAll flag end ------ id = 234 name = xx male = true ------ PrintDefaults start -------id inthelp msg for id (default 123)-malehelp msg for male-name stringhelp msg for name (default "default name") ------ PrintDefaults end ------ NArg = 3 NFlag = 3

在flag包中,進行了進一步封裝:將FlagSet的方法都重新定義了一遍,也就是提供了一序列函數,而函數中只是簡單的調用已經實例化好了的FlagSet

總結

以上是生活随笔為你收集整理的Go内置库模块 flag的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。