Go-标准库-flag(二)

2023-04-22 08:59:48 浏览数 (1)

自定义命令行参数解析

如果默认的命令行参数解析方式无法满足需求,我们可以使用 flag.Value 接口来自定义命令行参数解析。flag.Value 接口定义了 Set(string) errorString() string 两个方法,分别用于设置参数值和获取参数值的字符串表示。我们只需要实现这两个方法,就可以创建自己的命令行参数类型。

下面是一个示例,我们使用 flag.Value 接口来创建一个自定义命令行参数类型:

代码语言:javascript复制
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
go

0 人点赞