自定义命令行参数解析
如果默认的命令行参数解析方式无法满足需求,我们可以使用 flag.Value
接口来自定义命令行参数解析。flag.Value
接口定义了 Set(string) error
和 String() string
两个方法,分别用于设置参数值和获取参数值的字符串表示。我们只需要实现这两个方法,就可以创建自己的命令行参数类型。
下面是一个示例,我们使用 flag.Value
接口来创建一个自定义命令行参数类型:
package main
import (
"flag"
"fmt"
"strconv"
)
type myDuration float64
func (d *myDuration) Set(value string) error {
val, err := strconv.ParseFloat(value, 64)
if err != nil {
return fmt.Errorf("invalid duration %q", value)
}
*d = myDuration(val)
return nil
}
func (d *myDuration) String() string {
return fmt.Sprintf("%f", *d)
}
func main() {
var delay myDuration
flag.Var(&delay, "delay", "delay time")
flag.Parse()
fmt.Println("delay:", delay)
}
在上面的示例代码中,我们创建了一个名为 myDuration
的类型,并实现了 flag.Value
接口的两个方法。在 Set()
方法中,我们将传入的字符串转换为浮点数,并将其赋值给 myDuration
变量。如果转换失败,我们返回一个错误。在 String()
方法中,我们将 myDuration
变量转换为字符串。
然后,我们使用 flag.Var()
函数将 delay
变量与 -delay
选项绑定在一起。由于 delay
变量的类型是 myDuration
,因此我们需要将其传递给 flag.Var()
函数。
下面是一些命令行示例:
代码语言:javascript复制$ go run main.go -delay 1.5
delay: 1.500000
代码语言:javascript复制$ go run main.go -delay foo
invalid duration "foo"
Usage of /tmp/go-build1264960812/b001/exe/main:
-delay duration
delay time
exit status 2