2 回答
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)
}
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)
}
- 2 回答
- 0 关注
- 95 浏览
添加回答
举报