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 !