精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

命令行參數的解析:Flag 庫詳解

系統
如果真的遇上了所謂的復雜場景,那么還可以使用 Golang 的標準庫 flag 包來處理命令行參數。本文將介紹 Golang 標準庫中 flag 包的用法。

 [[375481]]

在 Golang 程序中有很多種方法來處理命令行參數。

簡單的情況下可以不使用任何庫,直接使用 os.Args

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "os" 
  6.  
  7. func main() { 
  8.     if len(os.Args) > 0 { 
  9.         for index, arg := range os.Args { 
  10.             fmt.Printf("args[%d]=%v\n"index, arg) 
  11.         } 
  12.     } 

試著運行一下,第一個參數是執行文件的路徑。

  1. $ go run demo.go hello world hello golang 
  2. args[0]=/var/folders/72/lkr7ltfd27lcf36d75jdyjr40000gp/T/go-build187785213/b001/exe/demo 
  3. args[1]=hello 
  4. args[2]=world 
  5. args[3]=hello 
  6. args[4]=golang 

從上面你可以看到,os.Args 只能處理簡單的參數,而且對于參數的位置有嚴格的要求。對于一些比較復雜的場景,就需要你自己定義解析規則,非常麻煩。

如果真的遇上了所謂的復雜場景,那么還可以使用 Golang 的標準庫 flag 包來處理命令行參數。

本文將介紹 Golang 標準庫中 flag 包的用法。

1. 參數種類

根據參數是否為布爾型,可以分為兩種:

  • 布爾型參數:如 --debug,后面不用再接具體的值,指定就為 True,不指定就為 False非布爾型參數
  • 非布爾型參數:非布爾型,有可能是int,string 等其他類型,如 --name jack ,后面可以接具體的參數值

根據參數名的長短,還可以分為:

  • 長參數:比如 --name jack 就是一個長參數,參數名前有兩個 -
  • 短參數:通常為一個或兩個字母(是對應長參數的簡寫),比如 -n ,參數名前只有一個 -

2. 入門示例

我先用一個字符串類型的參數的示例,拋磚引玉

  1. package main 
  2.  
  3. import ( 
  4.     "flag" 
  5.     "fmt" 
  6.  
  7. func main(){ 
  8.     var name string 
  9.     flag.StringVar(&name"name""jack""your name"
  10.  
  11. flag.Parse()  // 解析參數 
  12.     fmt.Println(name

flag.StringVar 定義了一個字符串參數,它接收幾個參數

  • 第一個參數 :接收值后,存放在哪個變量里,需為指針
  • 第二個參數 :在命令行中使用的參數名,比如 --name jack 里的 name
  • 第三個參數 :若命令行中未指定該參數值,那么默認值為 jack
  • 第四個參數:記錄這個參數的用途或意義

運行以上程序,輸出如下

  1. $ go run demo.go 
  2. jack 
  3.  
  4. $ go run demo.go --name wangbm 
  5. wangbm 

3. 改進一下

如果你的程序只接收很少的幾個參數時,上面那樣寫也沒有什么問題。

但一旦參數數量多了以后,一大堆參數解析的代碼堆積在 main 函數里,影響代碼的可讀性、美觀性。

建議將參數解析的代碼放入 init 函數中,init 函數會先于 main 函數執行。

  1. package main 
  2.  
  3. import ( 
  4.     "flag" 
  5.     "fmt" 
  6.  
  7. var name string 
  8.  
  9. func init()  { 
  10.     flag.StringVar(&name"name""jack""your name"
  11.  
  12. func main(){ 
  13.     flag.Parse() 
  14.     fmt.Println(name

4. 參數類型

當你在命令行中指定了參數,Go 如何解析這個參數,轉化成何種類型,是需要你事先定義的。

不同的參數,對應著 flag 中不同的方法。

下面分別講講不同的參數類型,都該如何定義。

布爾型

實現效果:當不指定 --debug 時,debug 的默認值為 false,你一指定 --debug,debug 為賦值為 true。

  1. var debug bool 
  2.  
  3. func init()  { 
  4.     flag.BoolVar(&debug, "debug"false"是否開啟 DEBUG 模式"
  5.  
  6. func main(){ 
  7.     flag.Parse() 
  8.     fmt.Println(debug) 

運行后,執行結果如下

  1. $ go run main.go  
  2. false 
  3. $ go run main.go --debug 
  4. true 

數值型

定義一個 age 參數,不指定默認為 18

  1. var age int 
  2.  
  3. func init()  { 
  4.     flag.IntVar(&age, "age", 18, "你的年齡"
  5.  
  6. func main(){ 
  7.     flag.Parse() 
  8.     fmt.Println(age) 

運行后,執行結果如下

  1. $ go run main.go  
  2. 18 
  3.  
  4. $ go run main.go --age 20 
  5. 20 

int64、 uint 和 float64 類型分別對應 Int64Var 、 UintVar、Float64Var 方法,也是同理,不再贅述。

字符串

定義一個 name參數,不指定默認為 jack

  1. var name string 
  2.  
  3. func init()  { 
  4.     flag.StringVar(&name"name""jack""你的名字"
  5.  
  6. func main(){ 
  7.     flag.Parse() 
  8.     fmt.Println(name

運行后,執行結果如下

  1. $ go run main.go  
  2. jack 
  3.  
  4. $ go run main.go --name wangbm 
  5. wangbm 

時間類型

定義一個 interval 參數,不指定默認為 1s

  1. var interval time.Duration 
  2.  
  3. func init()  { 
  4.     flag.DurationVar(&interval, "interval", 1 * time.Second"循環間隔"
  5.  
  6. func main(){ 
  7.     flag.Parse() 
  8.     fmt.Println(interval) 

驗證效果如下

  1. $ go run main.go  
  2. 1s 
  3.  
  4. $ go run main.go --interval 2s 
  5. 2s 

5. 自定義類型

flag 包支持的類型有 Bool、Duration、Float64、Int、Int64、String、Uint、Uint64。

這些類型的參數被封裝到其對應的后端類型中,比如 Int 類型的參數被封裝為 intValue,String 類型的參數被封裝為 stringValue。

這些后端的類型都實現了 flag.Value 接口,因此可以把一個命令行參數抽象為一個 Flag 類型的實例。下面是 Value 接口和 Flag 類型的代碼:

  1. type Value interface { 
  2.     String() string 
  3.     Set(string) error 
  4.  
  5. // Flag 類型 
  6. type Flag struct { 
  7.     Name     string // name as it appears on command line 
  8.     Usage    string // help message 
  9.     Value    Value  // value as set 是個 interface,因此可以是不同類型的實例。 
  10.     DefValue string // default value (as text); for usage message 
  11.  
  12. func Var(value Value, name string, usage string) { 
  13.     CommandLine.Var(value, name, usage) 

想要實現自定義類型的參數,其實只要 Var 函數的第一個參數對象實現 flag.Value接口即可

  1. type sliceValue []string 
  2.  
  3.  
  4. func newSliceValue(vals []string, p *[]string) *sliceValue { 
  5.     *p = vals 
  6.     return (*sliceValue)(p) 
  7.  
  8. func (s *sliceValue) Set(val string) error { 
  9.          // 如何解析參數值 
  10.     *s = sliceValue(strings.Split(val, ",")) 
  11.     return nil 
  12.  
  13. func (s *sliceValue) String() string { 
  14.     return strings.Join([]string(*s), ","

比如我想實現如下效果,傳入的參數是一個字符串,以逗號分隔,flag 的解析時將其轉成 slice。

  1. $ go run demo.go -members "Jack,Tom" 
  2. [Jack Tom] 

那我可以這樣子編寫代碼

  1. var members []string 
  2. type sliceValue []string 
  3.  
  4.  
  5. func newSliceValue(vals []string, p *[]string) *sliceValue { 
  6.     *p = vals 
  7.     return (*sliceValue)(p) 
  8.  
  9. func (s *sliceValue) Set(val string) error { 
  10.          // 如何解析參數值 
  11.     *s = sliceValue(strings.Split(val, ",")) 
  12.     return nil 
  13.  
  14.  
  15. func (s *sliceValue) String() string { 
  16.     return strings.Join([]string(*s), ","
  17.  
  18. func init()  { 
  19.     flag.Var(newSliceValue([]string{}, &members), "members""會員列表"
  20.  
  21. func main(){ 
  22.     flag.Parse() 
  23.     fmt.Println(members) 

有的朋友 可能會對 (*sliceValue)(p) 這行代碼有所疑問,這是什么意思呢?

關于這個,其實之前在 【2.9 詳細圖解:靜態類型與動態類型】有講過,忘記了可以前往復習。

6. 長短選項

flag 包,在使用上,其實并沒有沒有長短選項之別,你可以看下面這個例子

  1. package main 
  2.  
  3. import ( 
  4.     "flag" 
  5.     "fmt" 
  6.  
  7. var name string 
  8.  
  9. func init()  { 
  10.     flag.StringVar(&name"name""明哥""你的名字"
  11.  
  12. func main(){ 
  13.     flag.Parse() 
  14.     fmt.Println(name

通過指定如下幾種參數形式

  1. $ go run main.go  
  2. 明哥 
  3. $ go run main.go --name jack 
  4. jack 
  5. $ go run main.go -name jack 
  6. jack 

一個 - 和兩個 - 執行結果是相同的。

那么再加一個呢?

終于報錯了。說明最多只能指定兩個 -

  1. $ go run main.go ---name jack 
  2. bad flag syntax: ---name 
  3. Usage of /tmp/go-build245956022/b001/exe/main: 
  4.   -name string 
  5.         你的名字 (default "明哥"
  6. exit status 2 

7. 總結一下

flag 在絕大多數場景下,它是夠用的,但如果要支持更多的命令傳入格式,flag 可能并不是最好的選擇。

那些在標準庫不能解決的場景,往往會有相應的Go愛好者提供第三方解決方案。我所了解到的 cobra 就是一個非常不錯的庫。

 本文轉載自微信公眾號「Go編程時光」,可以通過以下二維碼關注。轉載本文請聯系Go編程時光公眾號。

 

責任編輯:武曉燕 來源: Go編程時光
相關推薦

2023-07-05 08:38:48

GolangGo語言

2021-08-10 21:58:54

Go語言Flag庫

2021-11-15 14:30:49

Pythonargparse編程語言

2017-03-08 11:10:39

LinuxShell命令

2021-11-08 10:45:07

Python命令工具

2024-05-15 17:05:16

GoLangflagcast

2010-03-10 17:23:37

Python 命令行參

2009-07-20 09:55:30

華為命令行解析華為認證

2010-08-20 10:05:23

用戶命令

2010-11-24 15:33:59

mysql命令行參數

2010-07-15 10:47:22

Perl命令行

2009-12-24 14:51:39

Linux命令行

2011-08-22 11:51:13

Linuxconfigure

2010-07-15 11:08:23

Perl命令行

2010-07-26 09:32:41

Perl命令行

2010-07-20 14:02:38

Perl命令行參數

2017-05-25 10:32:40

命令linux系統

2024-04-29 07:38:20

PythonDocopt開發

2009-08-11 09:58:22

Linux命令行Linux命令svn命令

2017-06-15 10:32:56

OracleDBV命令行工具
點贊
收藏

51CTO技術棧公眾號

免费日韩av片| 免费福利视频一区| 亚洲精品视频免费看| 国产欧美亚洲视频| 18岁成人毛片| 欧美交a欧美精品喷水| 色婷婷综合视频在线观看| 五月天丁香综合久久国产| 国产欧美一级片| 亚久久调教视频| 俺去啦;欧美日韩| 性农村xxxxx小树林| 亚州一区二区三区| 亚洲精品国产一区二区三区四区在线| 国产精品久久精品视| 欧美特级黄色片| 午夜国产精品视频| 在线观看国产精品淫| 亚洲视频 中文字幕| 精品国产欧美日韩一区二区三区| 亚洲国产一区二区三区| 亚洲精品自在在线观看| 三级小视频在线观看| 免费成人美女在线观看.| 久久久亚洲影院| 日本裸体美女视频| 天美av一区二区三区久久| 欧美一区二区三区在线看| 国产精品50p| 日本三级在线观看网站| 国产精品久久久久婷婷二区次| 国产伦精品一区二区三区免| 国产免费av观看| 亚洲欧美综合| www.亚洲男人天堂| 国产交换配乱淫视频免费| www.亚洲一二| 91精品婷婷国产综合久久竹菊| 国产第一页视频| 搞黄网站在线看| 综合久久综合久久| 五月天久久狠狠| 黄色国产在线| 91美女在线观看| 国产一区二区三区高清视频| 精品人妻无码一区二区三区蜜桃一 | jizzjizz亚洲| 中文字幕精品在线不卡| 欧美日韩另类综合| 五月婷婷六月丁香综合| 成人动漫一区二区三区| 亚洲最大福利网| 国产精品一级视频| 男女男精品视频网| 国产精品美女久久| 欧美男人天堂网| 亚洲欧美激情诱惑| 欧美有码在线视频| 毛片视频网站在线观看| 99香蕉国产精品偷在线观看 | 亚洲最黄网站| 97久久精品人人澡人人爽缅北| 久操免费在线视频| 欧美日韩国产一区精品一区| 欧美第一黄网免费网站| 亚洲欧美一区二区三区四区五区| 在线免费观看日本欧美爱情大片| 精品国内亚洲在观看18黄| 亚洲女人久久久| 99久久久久国产精品| 久久精品国产一区二区三区| 亚洲 欧美 变态 另类 综合| 婷婷亚洲五月| 欧美巨大黑人极品精男| 欧美日韩偷拍视频| 亚洲二区精品| 日本视频久久久| 日韩精选在线观看| 麻豆精品国产91久久久久久| 成人中文字幕+乱码+中文字幕| 国产色在线视频| 成人免费高清在线观看| 久久青青草原| 日本免费在线视频| 亚洲香肠在线观看| www.爱色av.com| 国产美女久久| 日韩精品一区二区三区视频| 中国极品少妇xxxx| 欧美亚洲精品在线| 久久综合伊人77777蜜臀| 国产一级在线观看视频| 视频一区中文字幕| 亚洲r级在线观看| 无码精品人妻一区二区三区影院 | 欧美日韩第一区日日骚| 国产吃瓜黑料一区二区| 日韩一级电影| 日韩视频永久免费观看| 亚洲综合一二三| 蜜桃一区二区三区四区| 不卡日韩av| 黄色片免费在线| 亚洲愉拍自拍另类高清精品| 999香蕉视频| 蜜桃精品视频| 亚洲欧美一区二区三区久久| 天天看片中文字幕| 噜噜噜在线观看免费视频日韩| 国产日韩欧美电影在线观看| 五月婷在线视频| 亚洲色图视频网站| 91精品91久久久中77777老牛| 亚洲精品无播放器在线播放| 亚洲精品国产精品久久清纯直播| 999精品在线视频| 久久精品三级| 99中文字幕| 一级毛片视频在线| 欧美三级免费观看| 91人妻一区二区三区| 精品国产一区探花在线观看| 欧美激情极品视频| 在线观看毛片av| 91丨porny丨中文| 特色特色大片在线| 国产一区高清| 国产亚洲精品综合一区91| 免费一级特黄特色大片| 精品一区二区影视| 欧美一区少妇| 理论不卡电影大全神| 91精品国产综合久久香蕉的特点 | 亚洲五月天综合| 国产96在线亚洲| 欧美另类在线播放| 91精品国自产| 国产精品色哟哟网站| 欧美日韩第二页| 久久中文字幕导航| 欧美大荫蒂xxx| 性做久久久久久久久久| 亚洲色图在线播放| √天堂资源在线| 亚洲欧美网站在线观看| 成人精品视频久久久久| 在线免费看黄网站| 欧美日韩一区在线观看| 亚洲一区二区三区日韩 | 182午夜在线观看| 欧美色网址大全| 国产成人久久久精品一区| 日韩专区一区二区| 色综合久久久久综合99| theav精尽人亡av| 亚洲影视综合| 免费亚洲精品视频| 欧美大片免费| 国产一区二区三区18| 91视频在线视频| 欧美经典一区二区| 亚洲精品久久久久久宅男| 久久国产影院| 91精品免费视频| 91精品久久久久久粉嫩| 欧美大片顶级少妇| 国产精品suv一区二区| 成人av在线影院| av黄色在线网站| 久久综合影院| 国产美女久久久| 国产美女在线观看| 日韩欧美电影在线| 日韩三级视频在线| 26uuu久久天堂性欧美| 青青在线视频免费| 日本欧美国产| 91香蕉亚洲精品| 爱情岛亚洲播放路线| 国产午夜精品久久久| 亚洲婷婷久久综合| 亚洲日本中文字幕区| 欧美性生交xxxxx| 久久国产精品99国产| 亚洲一区免费看| 成人线上播放| 日本精品性网站在线观看| 婷婷五月在线视频| 日韩欧美不卡在线观看视频| 国内自拍视频在线播放| 亚洲欧洲色图综合| 337p日本欧洲亚洲大胆张筱雨 | 韩日欧美一区二区| 高清在线观看av| 欧美一区二区三区视频在线观看| 国产无码精品视频| 中文字幕精品综合| 国产精品熟妇一区二区三区四区 | 68精品久久久久久欧美| 二区三区在线| 欧美zozo另类异族| 免费观看日批视频| 亚洲综合清纯丝袜自拍| 国产av自拍一区| 成人精品电影在线观看| 亚洲一级免费观看| 亚洲理伦在线| 国产又粗又爽又黄的视频| 妖精视频一区二区三区免费观看| 成人精品久久一区二区三区| 伊人久久av| 欧美激情按摩在线| 麻豆电影在线播放| 亚洲最新av在线| 天堂资源中文在线| 5858s免费视频成人| 欧美日韩一级黄色片| 亚洲激情自拍偷拍| 亚洲女人久久久| 久久精品人人做人人综合| 亚洲成人激情小说| 另类小说一区二区三区| 日韩在线xxx| 激情欧美亚洲| 国产又大又长又粗又黄| sdde在线播放一区二区| 蜜桃网站成人| 国产劲爆久久| 亚洲一区二区三区xxx视频| 日本国产欧美| 日本精品中文字幕| 97蜜桃久久| 欧美高清视频一区二区| 欧美人xxx| 中文字幕成人精品久久不卡| 日本护士...精品国| 亚洲国产精品国自产拍av秋霞| av在线亚洲天堂| 欧美精品乱码久久久久久| japanese国产在线观看| 欧美日韩中国免费专区在线看| 精品无码人妻一区二区三区品| 亚洲三级在线看| 日韩av网站在线播放| 欧美高清在线一区二区| 性欧美精品中出| 国产色一区二区| 蜜桃av免费看| 国产亚洲福利社区一区| 99久久久无码国产精品性| 久久婷婷色综合| 在线黄色免费网站| 99在线精品一区二区三区| 中文字幕在线观看91| 成人永久看片免费视频天堂| 国产精品熟妇一区二区三区四区| 国产91对白在线观看九色| 性高潮久久久久久| 成人午夜视频免费看| 国产精品久久久免费观看| 96av麻豆蜜桃一区二区| 日本丰满少妇裸体自慰| 久久久影视传媒| 摸摸摸bbb毛毛毛片| 国产精品灌醉下药二区| 538精品在线视频| 亚洲一二三四在线观看| 日韩女优在线观看| 色婷婷综合五月| 一级全黄裸体免费视频| 91精品国产综合久久精品麻豆| 亚洲爱情岛论坛永久| 亚洲第一精品夜夜躁人人躁 | 一区二区三区回区在观看免费视频| 你懂的免费在线观看| 最好看的2019的中文字幕视频| 久久国产精品一区| 久久久久久久色| 亚洲同志男男gay1069网站| 国产精品日韩欧美| 国内精品视频| 精品欧美国产一区二区三区不卡| 国产精品一国产精品| 在线视频不卡国产| 国产日韩精品视频一区二区三区| chinese少妇国语对白| 韩国欧美国产1区| 国产熟女高潮一区二区三区| 国产欧美日韩不卡| 久久久无码精品亚洲国产| 欧美视频免费在线观看| 精品国产www| 精品少妇一区二区三区日产乱码 | 日韩中文字幕欧美| av色在线观看| 国产精品一二三在线| 美女主播精品视频一二三四| 一本一本a久久| 9国产精品视频| 日日干日日操日日射| 91视频你懂的| 性欧美疯狂猛交69hd| 欧美日韩亚洲一区二| 国产普通话bbwbbwbbw| 日韩精品视频在线免费观看| 国产成人在线视频免费观看| 青青青国产精品一区二区| 久久伦理中文字幕| 日韩精品资源| 亚洲激情另类| 成人性生交视频免费观看| 久久久久久青草| 自拍偷拍亚洲在线| 国产精品一二三产区| 亚洲综合色激情五月| 成人综合久久| 国模吧无码一区二区三区| 国产成人av电影在线| 性少妇xx生活| 欧美日韩国产精品一区| 成人av一区二区三区在线观看| 中日韩美女免费视频网站在线观看| 高清电影在线免费观看| 91在线观看免费高清完整版在线观看 | 真实国产乱子伦精品一区二区三区| 国产成人无码精品久久久性色| 国产成人综合网| 午夜爱爱毛片xxxx视频免费看| 日本韩国精品在线| 免费a级毛片在线观看| 国语对白做受69| 91夜夜蜜桃臀一区二区三区| 9l视频自拍9l视频自拍| 蜜桃一区二区三区在线| 在线看片中文字幕| 色国产综合视频| 天天综合网天天综合| 久久久女人电视剧免费播放下载| 欧美二区观看| 青青草原网站在线观看| 狠狠色狠狠色综合系列| 亚洲综合图片一区| 欧美日韩久久一区二区| av电影在线播放高清免费观看| 国产精品高精视频免费| 国产日产精品_国产精品毛片| 国产精品免费成人| 久久精品视频一区二区| 中文字幕日韩免费| 亚洲人成电影在线播放| 最近高清中文在线字幕在线观看1| 蜜桃成人在线| 视频一区免费在线观看| 偷拍夫妻性生活| 91福利在线播放| wwwww在线观看免费视频| 国产精品美女www| 无码一区二区三区视频| 九九九九九九九九| 亚洲一区中文在线| 蜜桃91麻豆精品一二三区| 欧美激情欧美激情在线五月| 久本草在线中文字幕亚洲| 欧美三级在线观看视频| 2021久久国产精品不只是精品| 99re这里只有精品在线| 最新国产精品拍自在线播放| 四虎国产精品永久在线国在线 | 国产不卡一区二区在线观看 | 日本成人黄色网| 国产精品久久久久久久裸模| 国产精品久久久久久无人区| 成人精品免费网站| 久久精品色妇熟妇丰满人妻| 777亚洲妇女| 爱看av在线| 青青草国产精品| 国精产品一区一区三区mba视频 | 国产成人激情视频| 日韩精品不卡一区二区| 永久看看免费大片| 大伊人狠狠躁夜夜躁av一区| 国产系列在线观看| 国产日韩av在线| 亚洲国产免费看| aaaaa级少妇高潮大片免费看| 欧美特级限制片免费在线观看| av大全在线| 欧美亚州在线观看| 国产伦精一区二区三区| 国产成年人免费视频| 在线观看日韩www视频免费| 亚洲精品观看| 999精品网站| 一区二区三区中文在线| 国产精品秘入口| 国产三级精品在线不卡| 奇米777欧美一区二区| 国产精品成人aaaa在线| 中文字幕亚洲无线码在线一区|