Go 在其 flag 中有一些预定义的类型包裹。我该如何传递约会?
我模仿了the URL parsing example但它看起来有点冗长,我错过了一些东西。
package main
import (
"flag"
"fmt"
"time"
)
const dateLayout = "2006-01-02"
type DateValue struct {
Date *time.Time
}
func (v DateValue) String() string {
if v.Date != nil {
return v.Date.Format(dateLayout)
}
return ""
}
func (v DateValue) Set(str string) error {
if t, err := time.Parse(dateLayout, str); err != nil {
return err
} else {
*v.Date = t
}
return nil
}
func main() {
var d = &time.Time{}
flag.Var(&DateValue{d}, "date", "Date part of ISO")
flag.Parse([]string{"--date", "2022-08-08"})
fmt.Printf(`{date: %q}`, d)
}
可惜,此操作因错误而失败。您可以在 playground 看到它
./prog.go:35:13: too many arguments in call to flag.Parse
have ([]string)
want ()
最佳答案
Parse解析 os.Args[1:]
中的命令行标志并且需要在定义顶级标志后调用。构建子命令,例如prog --date <date-val>
,使用Flagset
.
您可以从方法签名中注意到,它确实 not take any arguments ,这就是您因参数不匹配而立即出错的原因( pkg.go.dev 是您的 friend )
使用所示代码,创建默认 Flagset并分配新的标志和关联值
func main() {
var d = &time.Time{}
fs := flag.NewFlagSet("DateValue", flag.ExitOnError)
fs.Var(&DateValue{d}, "date", "Date part of ISO")
fs.Parse([]string{"--date", "2022-08-08"})
fmt.Printf(`{date: %q}`, d)
}
关于go - 如何将日期传递给命令行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73274432/