在Go中使用命令行標誌

有很多使用Go處理CLI標誌的方法。第一種選擇是根本不使用任何庫,然後檢查os.Args。第二種選擇是使用標準庫flag包裹。第三種選擇是使用許多第三方CLI庫之一,例如眼鏡蛇

讓我們來談談第二種選擇:使用標準庫flag,因為與原始解析相比,它提供了很多好處os.Args它是內置的。

添加import "flag"到包的導入部分,就可以使用了。

接受int參數類型:

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

var count = flag.Int(“count”, 5, “the count of items”) fmt.Println("count value ", *count)

第一個參數是CLI命令中使用的標誌名,第二個參數是默認值,第三個參數是描述。

提供了一種替代語法flag.IntVar()

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

var count int flag.IntVar(&count, “count”, 5, “the count of items”) fmt.Println("count value ", count)

在此,參數被移位,並且第一個參數是變量參考。

主要區別在於,在第一種情況下,您將獲得一個指針。在第二種情況下,您可以獲得價值。

flag提供許多功能來解析不同的標誌類型,對於每種您要接受的類型,您都需要使用不同的標誌:

func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Duration(name string, value time.Duration, usage string) *time.Duration
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func Int(name string, value int, usage string) *int
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func IntVar(p *int, name string, value int, usage string)
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)
func Uint(name string, value uint, usage string) *uint
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func UintVar(p *uint, name string, value uint, usage string)

為標誌傳遞錯誤的類型將引發錯誤,暫停程序,並且所需的用法將被打印給用戶。

例如,以下是解析字符串的方法:

var description = flag.String("description", "default value", "the description of the flag")

標誌語法

你如何設置標誌?簡單:附加-flagname到CLI命令,並提供4種替代但等效的語法:

-count=x
-count x
--count=x
--count x

您可以根據需要將任意多個標誌傳遞給命令,但這是第一次flag無法識別標誌,它將停止解析其他標誌。這意味著,如果您還具有非標誌參數,則所有標誌必須都在開頭。

解析標誌

定義所有標誌後,您需要調用

flag.Parse()

實際解析它們。

布爾標誌

布爾標誌可以通過添加來設置-count,這會使boolean標誌獲得true價值。設置一個false值,使用-count=false。這些值中的任何一個對於布爾標誌均有效:1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False

簡短的選擇

在現實世界中,很多時候您會看到CLI應用程序接受帶有描述性名稱的標誌以及帶有字母縮寫的同一標誌。您可以通過提供2個標誌處理程序來做到這一點:

var gopherType string

func init() { const ( defaultGopher = “pocket” usage = “the variety of gopher” ) flag.StringVar(&gopherType, “gopher_type”, defaultGopher, usage) flag.StringVar(&gopherType, “g”, defaultGopher, usage+" (shorthand)") }

解析非標誌參數

flag程序包提供了一些方法還可以解析非標記參數。

flag.Args()

返回參數未解析為標誌的字符串切片。

根據需要強制標記

flag程序包不提供針對此問題的內置解決方案。您需要自己處理這種情況:

// [...]
flag.Parse()

if *count == “” { flag.PrintDefaults() os.Exit(1) }

更高級的主題

這是一篇介紹性文章。您可以從這裡進入更深入的主題,例如實現子命令和定義自己的標誌類型。看https://blog.komand.com/build-a-simple-cli-tool-with-golang有關CLI的更高級用法。

參考


更多教程: