go - 如何将日期传递给命令行?

标签 go

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-playground

关于go - 如何将日期传递给命令行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73274432/

相关文章:

go - testing.M 在 golang 中恢复

go - "go get"使用http_proxy时忽略GOPROXY

go - 用delve调试Go软件包时,<autogenic>:1是什么意思?

macos - 去构建并执行: fork/exec: permission denied

go - 为什么这个 goroutine 会阻塞?

postgresql - golang 中的 postgres 查询

go - 在 Go 中创建包装器库时重新分配常量

go - 具有字段标记的匿名结构之间的类型转换

go - 如何确定哪些数据库表列需要从修改后的结构中更新?

Python AES-CTR 与 Golang 不兼容