英文:
How to pass a date to command line?
问题
Go语言的flag包中有一些预定义的类型。我该如何传递一个日期?
我模仿了URL解析的示例,但看起来有点冗长,我可能漏掉了一些东西。
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: flag.Parse调用中的参数过多
有 ([]string)
需要 ()
英文:
Go has a few predefined types in its flag package. How would I pass a date?
I have mimicked the URL parsing example but it looks a bit verbose and I am missing smth.
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)
}
Alas, this fails with an error. You can see it at the playground
> ./prog.go:35:13: too many arguments in call to flag.Parse
>
> have ([]string)
>
> want ()
答案1
得分: 3
Parse 从 os.Args[1:]
解析命令行标志,需要在定义顶级标志后调用。要构建子命令,例如 prog --date <date-val>
,请使用 Flagset
。
从方法签名可以看出,它不接受任何参数,这就是你在参数不匹配时立即出现错误的原因(pkg.go.dev 是你的朋友)
根据你的代码,创建一个默认的 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)
}
英文:
Parse parses the command-line flags from os.Args[1:]
and needs to be called after the top level flags are defined. To build sub-commands e.g. prog --date <date-val>
, use a Flagset
.
You can notice from the method signature, that it does not take any arguments, which is the reason for your immediate error on the argument mismatch (pkg.go.dev is your friend)
With your code as shown, create a default Flagset and assign new flags and associated values
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论