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