1.介绍
在 Go
中,如果要接收命令行参数,需要使用 flag
包进行解析。不同的参数类型可以通过不同的方法接收。
2.参数接受
2.1 接受方式
使用flag
接收参数,可以由以下三种方式接受:
- 方式一:
flag.Type(name,defaultVal,desc)
- 方式二:
flag.TypeVar(&flagVar,name,defaultVal,desc)
- 方式三:
flag.Var(&flagVar,name,desc)
- 方式四:
flag.Args()
- 方式五:
flag.Arg(i)
字段 |
说明 |
flag.Type |
这里的Type 是个抽象的概念,不是具体函数名 |
name |
代表输入参数名 |
defaultVal |
默认值 |
desc |
描述信息 |
2.2 注意事项
- 上面接收方式一、二、三,都是最后调用
flag.Parse()
,而方式四和方式五是提前调用flag.Parse()
。
- 方式一、二、三传参时,注意布尔类型,尽量设置成
-flag=val
,否则会影响后面的参数解析。
- 方式四、五不能使用
-flag=val
这种格式传参。
3.flag.Type
3.1 代码
package main import ( "flag" "fmt" ) var ( str = flag.String("name","默认名","用户姓名") age = flag.Int("age",18,"用户年龄") smoking = flag.Bool("smoking",false,"是否吸烟") ) func main() { flag.Parse() fmt.Printf("str: %v\n",*str) fmt.Printf("age: %v\n",*age) fmt.Printf("smoking: %v\n",*smoking) }
|
3.2 编译运行
➜ go build main.go
➜ ./main str: 默认名 age: 18 smoking: false
➜ /main -name 张三 -age 100 -smoking=true str: 张三 age: 100 smoking: true
|
4.flag.TypeVar
4.1 代码
package main import ( "flag" "fmt" )
var ( name string age int smoking bool weight float64 ) func main() { flag.StringVar(&name,"name","默认名字","用户名") flag.IntVar(&age,"age",18,"用户年龄") flag.BoolVar(&smoking,"smoking",false,"是否吸烟?") flag.Float64Var(&weight,"w",60.0,"体重") flag.Parse() fmt.Printf("姓名: %v\n",name) fmt.Printf("年龄: %v\n",age) fmt.Printf("是否吸烟?: %v\n",smoking) fmt.Printf("体重: %v\n",weight) }
|
4.2 编译运行
➜ go build main.go
➜ ./main 姓名: 默认名字 年龄: 18 是否吸烟?: false 体重: 60
➜ ./main -name 张三 -age 22 -smoking=true -w=88.9 姓名: 张三 年龄: 22 是否吸烟?: true 体重: 88.9
|
4.3 细节
在传参数过程中,发现布尔型传参如果不设置=
,会影响后面的参数接收,具体如下:
➜ gin-use git:(dev) ✗ ./main -smoking true -name 哈哈 姓名: 默认名字 年龄: 18 是否吸烟?: true 体重: 60
➜ gin-use git:(dev) ✗ ./main -smoking=true -name 哈哈 姓名: 哈哈 年龄: 18 是否吸烟?: true 体重: 60
|
5.flag.Var
通过 flag.Var()
绑定自定义类型,自定义类型需要实现 Value
接口(Receives
必须为指针)
5.1 代码
package main
import ( "flag" "fmt" "strings" )
type Likes []string func (l *Likes) String() string { return fmt.Sprintf("%v",*l) } func (l *Likes)Set(s string) error { split := strings.Split(s, ",") *l = split return nil } func main() { var likeList Likes flag.Var(&likeList,"likes","接收自定义类型") flag.Parse() fmt.Println(likeList) }
|
5.2 编译运行
➜ go build main.go
➜ ./main -likes=篮球,足球,游戏 [篮球 足球 游戏]
|
6.flag.Args
一次打印出全部的入参,注意入参格式不能是-flag=val
格式。
6.1 代码
package main import ( "flag" "fmt" ) func main() { flag.Parse() args := flag.Args() fmt.Println(args) }
|
6.2 编译运行
➜ go build main.go
➜ ./main -name=张三 -age=18 -sex=男 flag provided but not defined: -name Usage of ./main:
➜ ./main 张三 18 男 [张三 18 男]
|
7.flag.Arg(i)
获取指定索引位置的参数,默认索引位置是0;注意入参格式不能是-flag=val
格式。
7.1 代码
package main import ( "flag" "fmt" ) func main() { flag.Parse() p0 := flag.Arg(0) p1 := flag.Arg(1) p2 := flag.Arg(2) fmt.Printf("索引=0,v=%v\n",p0) fmt.Printf("索引=1,v=%v\n",p1) fmt.Printf("索引=2,v=%v\n",p2) }
|
7.2 编译运行
➜ go build main.go
➜ ./main 张三 18 男 索引=0,v=张三 索引=1,v=18 索引=2,v=男
|