gpt4 book ai didi

go - 如何使用 Viper 访问 `StringToStringVar` 类型的 Cobra Flag?

转载 作者:行者123 更新时间:2023-12-01 22:28:09 27 4
gpt4 key购买 nike

我正在尝试在 Go 中开发一个应用程序,它接受命令行上的输入作为键值对字符串。为此,我使用 StrngToStringVar来自眼镜蛇图书馆。

我还使用 Viper 将这些标志绑定(bind)到配置,但是无论我输入什么值,我似乎都无法从 Viper 获得它。

这是代码

package main

import (
"fmt"

"github.com/spf13/cobra"
"github.com/spf13/viper"

"github.com/davecgh/go-spew/spew"
)

func main() {
var items map[string]string
var name string

rootCmd := &cobra.Command{
Use: "cobra",
Short: "Test options on the command line",
Long: ``,
Run: func(ccmd *cobra.Command, args []string) {

spew.Dump(viper.GetString("name"))
spew.Println("")

fmt.Println("GetStringMap")
spew.Dump(viper.GetStringMap("items"))

fmt.Println("")

fmt.Println("GetStringMapString")
spew.Dump(viper.GetStringMapString("items"))
},
}

rootCmd.Flags().StringVar(&name, "name", "", "Name of the list")
rootCmd.Flags().StringToStringVar(&items, "item", nil, "Map stating the items to be included")

viper.BindPFlag("name", rootCmd.Flags().Lookup("name"))
viper.BindPFlag("items", rootCmd.Flags().Lookup("item"))

rootCmd.Execute()
}

如果我使用命令 go run .\main.go --item shopping=apple,banana --name foobar 运行它我得到以下结果
(string) (len=6) "foobar"

GetStringMap
(map[string]interface {}) {
}

GetStringMapString
(map[string]string) {
}

可以看出,即使我正确设置了输入(我相信),他的输出也不包含任何项目。我一直在尝试使用 PR https://github.com/spf13/pflag/pull/133弄清楚如何去做,但我没有任何运气。

我想知道绑定(bind)是否不正确,但是我已经在其他项目中成功使用了 CObra,所以我对如何引用生成的 map[string]string 缺乏了解来自眼镜蛇。

最佳答案

就绑定(bind)部分而言,是正确的。但是,在处理之前,您可以使用 vipver.IsSet() 验证特定 key 是否存在。 , 使用 viper.AllKeys() 打印所有可用的 key 或使用 viper.AllSettings() 打印所有内容.

这是一个示例(test.go):

package main

import (
"fmt"

"github.com/spf13/cobra"
"github.com/spf13/viper"
)

func main() {
var items map[string]string

rootCmd := &cobra.Command{
Use: "app",
Run: func(ccmd *cobra.Command, args []string) {

fmt.Println("item exists?", viper.IsSet("item"))
fmt.Println("GetString :", viper.GetString("item"))
fmt.Println("Keys :", viper.AllKeys())
fmt.Println("Settings :", viper.AllSettings())
},
}

rootCmd.Flags().StringToStringVarP(&items, "item", "i", nil, "Map stating the items to be included")
viper.BindPFlag("item", rootCmd.Flags().Lookup("item"))
rootCmd.Execute()
}

输出:
$ ./test.exe -i 'k=v,"a=b,c"'
item exists? true
GetString : [k=v,"a=b,c"]
Keys : [item]
Settings : map[item:[k=v,"a=b,c"]]
GetStringMap()的用法和 GetStringMapString()对 JSON、YAML 等其他格式更有意义。您可以将这些函数的执行跟踪到 Debug模式下的 JSON 解码调用。

对于 map 转换,您可以像这样编写自己的函数( live):
func getStringMap(s string) map[string]string {
entries := strings.Split(s, ",")

m := make(map[string]string)
for _, e := range entries {
tokens := strings.Split(e, "=")
k := strings.TrimSpace(tokens[0])
v := strings.TrimSpace(tokens[1])
m[k] = v
}

return m
}

关于go - 如何使用 Viper 访问 `StringToStringVar` 类型的 Cobra Flag?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58452611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com