有没有办法确定使用 `flag.VisitAll` 时是否设置了标志?

我正在使用 go 的原生"flag"包。

它内置了访问所有当前定义的标志的能力,使用flag.VisitAll.

我正在尝试构建一个片段,该片段试图从环境变量中获取该标志的值(如果存在)并且以防未设置该标志,并且我找不到确定是否设置了特定标志的方法或不。

有没有办法在不实现新参数类型的情况下实现这一目标?


ITMISS
浏览 73回答 2
2回答

哔哔one

使用flag.VisitAll声音有点复杂;我建议获取具有合理默认值的环境变量并将其用作标志的默认值 - 这意味着如果未设置标志,环境变量将成为后备:package mainimport (    "flag"    "fmt"    "os")func GetEnvDefault(key, def string) string {    v := os.Getenv(key)    if v == "" {        return def    }    return v}func main() {    // Uncomment to test behaviour    // os.Setenv("SERVER_NAME", "donaldduck")    var serverName string    flag.StringVar(&serverName, "n", GetEnvDefault("SERVER_NAME", "mickeymouse"), "The human name for the server")    flag.Parse()    fmt.Println(serverName)}

慕哥6287543

没有遍历未设置的命令行标志的功能。VisitAll但是,可以通过取和返回的标志之间的差异来实现此功能Visit;前者遍历所有标志,而后者遍历设置的标志:func UnsetFlags(fs *flag.FlagSet) []*flag.Flag {    var unset []*flag.Flag    fs.VisitAll(func(f *flag.Flag) {        unset = append(unset, f)    })    fs.Visit(func(f *flag.Flag) {        for i, h := range unset {            if f == h {                unset = append(unset[:i], unset[i+1:]...)            }        }    })    return unset}您可以在调用后使用该函数flag.Parse将任何未设置的标志设置为其环境值:for _, f := range UnsetFlags(flag.CommandLine) {    v := os.Getenv(f.Name)    f.Value.Set(v)}
打开App,查看更多内容
随时随地看视频慕课网APP