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 !
