当前位置: > > > > 将带有破折号分隔的单词的标志映射到camel_case配置?
将带有破折号分隔的单词的标志映射到camel_case配置?
来源:stackoverflow
2024-04-19 12:27:39
0浏览
收藏
一分耕耘,一分收获!既然都打开这篇《将带有破折号分隔的单词的标志映射到camel_case配置?》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!
问题内容
我的配置格式如下所示:
type config struct {
foobar string `mapstructure:"foo_bar"`
bazbot string `mapstructure:"baz_bot"`
}
我的基于 cobra 的 cli 具有带有破折号的标志(例如 --foo-bar=value1 --baz-bot=value2)。
当在 cli 中设置这些值以覆盖配置文件值时,viper 不知道如何将它们正确映射到配置中。这里有什么解决办法吗? viper 配置设置如下所示:
func loadConfig(cmd *cobra.Command) (*config, error) {
res := &config{}
if err := viper.BindPFlags(cmd.Flags()); err != nil {
return nil, err
}
viper.SetEnvPrefix("K")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
viper.AutomaticEnv()
var useConfigFile bool
if configFile, _ := cmd.Flags().GetString("config"); configFile != "" {
useConfigFile = true
viper.SetConfigFile(configFile)
}
if useConfigFile {
if err := viper.ReadInConfig(); err != nil {
return nil, err
}
if err := viper.Unmarshal(res); err != nil {
return nil, err
}
}
return res, nil
}
如果 viper 无法做到这一点,也愿意接受对支持此功能的库的建议。
解决方案
首先,您应该定义标志。我不知道,根据你的例子,你是否这样做,但你应该做类似的事情():
cfg := &config{}
val := reflect.valueof(cfg).elem()
for i := 0; i < val.numfield(); i++ {
fieldtype := val.type().field(i)
name := fieldtype.tag.get("mapstructure")
rootcmd.persistentflags().string(strings.replaceall(name, "_", "-"), "default", "usage")
}
这样,--help 命令将向您显示可用的标志(--foo-bar 和 --baz-bot)。
然后您应该在 loadconfig 方法中绑定标志:
cmd.Flags().VisitAll(func(flag *pflag.Flag) {
if err := viper.BindPFlag(strings.ReplaceAll(flag.Name, "-", "_"), flag); err != nil {
return
}
})
这对我有用。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《将带有破折号分隔的单词的标志映射到camel_case配置?》文章吧,也可关注米云公众号了解相关技术文章。
