# Go语言flag接收slice和map类型参数
2 min read
文章目录
前言
go 自带的flag包可以很容易的实现一个命令行程序的参数解析,但是flag包默认只支持几个基本类型的参数解析,如果需要传递slice或者map类型时就要自定义了,这里记录一下。
原理
通过flag.Var()方法传递一个Value接口,即可自定义命令行参数的解析,flag.Value接口:
type Value interface { String() string Set(string) error}接下来通过自定义类型来实现这个接口即可满足需求。
slice 传递
type sliceFlag []string
func (f *sliceFlag) String() string { return fmt.Sprintf("%v", []string(*f))}
func (f *sliceFlag) Set(value string) error { *f = append(*f, value) return nil}
func main() { var hostsFlag sliceFlag flag.Var(&hostsFlag, "host", "Application hosts,for example: -host=a.com -host=b.com")}这里需要注意的是数组的扩容需要使用*f = append(*f, value),来修改原本的数组
map 传递
func (f mapFlag) String() string { return fmt.Sprintf("%v", map[string]string(f))}
func (f mapFlag) Set(value string) error { split := strings.SplitN(value, "=", 2) f[split[0]] = split[1] return nil}
func main() { var hostsFlag sliceFlag flag.Var(&hostsFlag, "env", "env list,for example: -env key1=value1 -env key2=value2")}