golang之命令行參數


當我們希望通過命令行啟動Golang程序,獲取輸入的各種形式參數時,該如何處理呢?

 

[os.Args]

os.Args是一個string的切片,用來存儲所有的命令行參數,包括go run main.go這部分,整體編譯后實際是生成和運行的main.exe文件,所以第一個參數是main.exe。示例如下:

func main() {
    for i ,v := range os.Args {
        fmt.Println(i, v)
    }
}

命令行攜帶參數啟動:go run main.go -name korbin aaa bbb ccc

0 C:\Users\Korbin\AppData\Local\Temp\go-build427584346\b001\exe\main.exe
1 -name
2 korbin
3 aaa
4 bbb
5 ccc

 

[flag]

Golang內置的flag包提供了一系列解析命令行參數的功能接口,使用flag主要包括以下幾步:

1.定義flag命令行參數

1).通過flag.String()Bool()Int() 等flag.Xxx()方法,該種方式返回一個相應的指針:

ip := flag.Int("name", "korbin", "the author's name")

方法中有三個參數:

  name:表示指定的參數名,在命令行中輸入為-name或--name

  value:表示默認值

  usage:參數說明描述

 

2).通過flag.XxxVar()方法將參數值綁定到一個變量,該種方式無返回值,如:

var name string
flag.StringVar(&name , "name", "korbin", "the author's name")

3).通過flag.Var()綁定自定義類型,自定義類型需要實現Value接口(Receives必須為指針),如:

flag.Var(&name, "name", "the author's name")

對於這種類型的flag,默認值為該變量類型的初始值,即輸入的是int類型則默認為0,string默認為空等。

 

2.flag.Parse()

第二步,調用flag.Parse() 將命令行參數解析到定義的flag:

flag.Parse()

解析函數將會在碰到第一個非flag命令行參數時停止,非flag命令行參數是指不滿足命令行語法的參數,如命令行參數為cmd --flag=true abc則第一個非 flag 命令行參數為“abc”

 

3.

通過上述定義參數和解析參數兩步,就已經是可以拿到我們的參數了。並且對於非命令行參數,還可通過flag.Args()flag.Arg(i)來獲取 ~

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    s := flag.String("name", "korbin", "這是作者的姓名")
    flag.Parse()
    fmt.Println("命令行參數name的值:",*s)
    fmt.Printf("非命令行參數切片:%v", flag.Args())
}

命令行攜帶參數啟動:go run main.go -name korbin aaa bbb ccc,運行結果如下:

命令行參數name的值: korbin
非命令行參數切片:[aaa bbb ccc]

 

flag 支持的解析類型有下面四種

  • -flag
  • --flag
  • -flag=x
  • -flag x (bool 不能用這個)

有時候我們只需要一個 flag 就夠了,選項本身就帶着含義,不需要參數。而有些時候我們既需要 flag,也需要參數。注意區分好場景即可。如果用了第一種和第二種這種不帶參數的,本質含義就是個 bool,出現就是 true,不出現就看默認值。

 

 

flag參考:

  • https://mp.weixin.qq.com/s/j-6tdYSdplY8Q2mwMgw8jQ

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM