概述
- 官方文档地址
- 接收命令行传参
- 给出友好的提示信息
- 推荐这样传参:
--name=yky --age=20
- 主要分为
flag
和 flagSet
, flag
使用 flag
底层实现是 flagSet
, flagSet
的默认命名是脚本名
方法清单
flag 和 flagSet 共有
- 定义
- 数字相关:
flag.Int()
, flag.Int64()
, flag.IntVar()
, flag.Int64Var()
, flag.Uint()
, flag.Uint64()
, flag.UintVar()
, flag.Uint64Var()
, flag.Float64()
, flag.Float64Var()
- 布尔值相关:
flag.Bool()
, flag.BoolVar()
- 字符串相关:
flag.String()
, flag.StringVar()
- 时长相关:
flag.Duration()
, flag.DurationVar()
- 功能
flag.Parse()
: 解析命令行参数(使用方法略有不同, flagSet 调用需要传入参数切片)
flag.Lookup()
: 查找指定命名的 flag 变量, 存在返回*flag.Flag
, 不存在返回nil
flag.PrintDefaults()
: 输出帮助信息
flag.Var()
: 定义
flag.Set()
: 修改
flag.NFlag()
: 被命令行设置的 flag 参数的数量
- 非 flag 变量相关
flag.NArg()
: 非 flag 参数个数
flag.Args()
: 非 flag 参数列表
flag.Arg()
: 根据索引取非 flag 参数内容
- 判断
flag.Parsed()
: 判断是否执行过 Parse()
flagSet 独有
fs.NewFlagSet()
: 初始化一个 flagSet
fs.Init()
:
fs.SetOutput
: 设置输出的位置, 参数类型为 io.Writer
使用
flag 示例
package main
import (
"flag"
"fmt"
)
func main() {
var name string
flag.StringVar(&name, "name", "yky", "姓名")
age := flag.Int("age", 18, "年龄")
flag.Parse()
fmt.Printf("name: %v, age: %v\n", name, *age)
}
flagSet 示例
package main
import (
"flag"
"fmt"
)
func main() {
fs := flag.NewFlagSet("main", flag.ExitOnError)
var name string
fs.StringVar(&name, "name", "yky", "姓名")
age := fs.Int("age", 18, "年龄")
fs.Parse(os.Args[1:])
fmt.Printf("name: %v, age: %v\n", name, *age)
}
进阶示例
时长示例
package main
import (
"flag"
"fmt"
"time"
)
func main() {
sleep := flag.Duration("sleep", 1*time.Second, "延迟执行时间")
flag.Parse()
fmt.Printf("sleeping for %v...\n", *sleep)
time.Sleep(*sleep)
}
lookup (配合类型断言)
package main
import (
"flag"
"fmt"
)
func main() {
flag.Int("age", 18, "年龄")
flag.Parse()
if flag.Lookup("age") != nil {
v := flag.Lookup("age").Value
fmt.Printf("%T: %[1]v\n", v.String())
y := v.(flag.Getter).Get()
z1 := y.(int)
fmt.Printf("%T: %[1]v\n", z1)
z2, ok := y.(int)
if ok {
fmt.Printf("%T: %[1]v\n", z2)
}
}
}
其他
flag.Parsed()
flag.Lookup("age").Value.Set("190")
flag.Lookup("age").Value.String()
fmt.Printf("是否解析命令行参数: %v, 解析匹配个数: %v\n", flag.Parsed(), flag.NFlag())
if flag.NArg() == 0 {
fmt.Println("没有额外参数")
else {
fmt.Printf("额外参数列表: %v\n", flag.Args())
fmt.Printf("取索引为 0 的参数作为示例: %v\n", flag.Arg(0))
}
flag.PrintDefaults()
源码
var
var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
var Usage = func() {
fmt.Fprintf(CommandLine.Output(), "Usage of %s:\n", os.Args[0])
PrintDefaults()
}
struct
type Flag struct {
Name string
Usage string
Value Value
DefValue string
}
type FlagSet struct {
Usage func()
name string
parsed bool
actual map[string]*Flag
formal map[string]*Flag
args []string
errorHandling ErrorHandling
output io.Writer
}
Interface
type Value interface {
String() string
Set(string) error
}
type Getter interface {
Value
Get() interface{}
}
func
type float64Value float64
func newFloat64Value(val float64, p *float64) *float64Value {
*p = val
return (*float64Value)(p)
}
func (f *float64Value) Set(s string) error {
v, err := strconv.ParseFloat(s, 64)
if err != nil {
err = numError(err)
}
*f = float64Value(v)
return err
}
func (f *float64Value) Get() interface{} { return float64(*f) }
func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) }