为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ITMISS 2023-04-24 16:43:48
我正在使用 go 的原生"flag"包。它内置了访问所有当前定义的标志的能力,使用flag.VisitAll.我正在尝试构建一个片段,该片段试图从环境变量中获取该标志的值(如果存在)并且以防未设置该标志,并且我找不到确定是否设置了特定标志的方法或不。有没有办法在不实现新参数类型的情况下实现这一目标?
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

使用flag.VisitAll声音有点复杂;我建议获取具有合理默认值的环境变量并将其用作标志的默认值 - 这意味着如果未设置标志,环境变量将成为后备:


package main


import (

    "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)

}


查看完整回答
反对 回复 2023-04-24
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

没有遍历未设置的命令行标志的功能。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)

}


查看完整回答
反对 回复 2023-04-24
  • 2 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信