flag包是Go語言標准庫提供用來解析命令行參數的包,使得開發命令行工具更為簡單
常用方法
1.flag.Usage
輸出使用方法,如linux下ls -h的幫助輸出
2.flag.Type(參數名, 默認值, 使用提示)
Type為類型 如String, Int, Uint 調用相應的flag.Sring flag.Int flag.Uint方法
方法返回相應類型的指針
3.flag.Type(指針, 參數名, 默認值, 使用提示)
與flag.Type方法基本相同,不同的是多一個指針參數,將使用傳入的指針,不會再創建指針返回
4.flag.Args
返回解析完命令行參數后的其他參數,如./sh -name cqh a1 a2,將返回a1 a2
5.flag.Parse
執行解析
使用示例代碼
創建test.go
package main import ( "fmt" "flag" ) func main() { namePtr := flag.String("name", "username", "姓名") agePtr := flag.Int("age", 18, "年齡") musclePtr := flag.Bool("muscle", true, "是否有肌肉") var email string flag.StringVar(&email, "email", "chenqionghe@sina.com", "郵箱") flag.Parse() args := flag.Args() fmt.Println("name:", *namePtr) fmt.Println("age:", *agePtr) fmt.Println("muscle:", *musclePtr) fmt.Println("email:", email) fmt.Println("args:", args) }
執行go buld后,建立test執行文件
./test -h
輸出
Usage of ./test: -age int 年齡 (default 18) -email string 郵箱 (default "chenqionghe@sina.com") -muscle 是否有肌肉 (default true) -name string 姓名 (default "username")
執行
./test -name 肌肉男 -age 20 -email muscle@muscle.com 哈哈 呵呵 嘿嘿
輸出
name: 肌肉男 age: 20 muscle: true email: muscle@muscle.com args: [哈哈 呵呵 嘿嘿]
自定義flag
只要實現flag.Value接口即可
type Value interface { String() string Set(string) error }
如下定義了一個Hello類型,實現了Value接口
//自定義解析參數,實現Set和String方法 type Hello string func (p *Hello) Set(s string) error { v := fmt.Sprintf("Hello %v", s) *p = Hello(v) return nil } func (p *Hello) String() string { return fmt.Sprintf("%f", *p) }
使用示例代碼
package main import ( "fmt" "flag" ) //自定義解析參數,實現Set和String方法 type Hello string func (p *Hello) Set(s string) error { v := fmt.Sprintf("Hello %v", s) *p = Hello(v) return nil } func (p *Hello) String() string { return fmt.Sprintf("%f", *p) } func main() { namePtr := flag.String("name", "username", "姓名") agePtr := flag.Int("age", 18, "年齡") musclePtr := flag.Bool("muscle", true, "是否有肌肉") var email string flag.StringVar(&email, "email", "chenqionghe@sina.com", "郵箱") var hello Hello flag.Var(&hello, "hello", "hello參數") flag.Parse() others := flag.Args() fmt.Println("name:", *namePtr) fmt.Println("age:", *agePtr) fmt.Println("vip:", *musclePtr) fmt.Println("hello:", hello) fmt.Println("email:", email) fmt.Println("other:", others) }
重新build后運行
./test -name 肌肉男 -age 20 -email muscle@muscle.com -hello 陳瓊和 哈哈 呵呵 嘿嘿
輸出
name: 肌肉男 age: 20 vip: true hello: Hello 陳瓊和 email: muscle@muscle.com other: [哈哈 呵呵 嘿嘿]
就是這樣,Light weight baby !