Я пытаюсь разработать приложение на Go, которое принимает ввод в командной строке в виде строки пар ключ-значение. Для этого я использую StrngToStringVar
из библиотеки Cobra.
Я также использую Viper для привязки этих флагов к конфигурации, однако какое бы значение я ни поставил, я не могу получить его от 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, чтобы понять, как это сделать, но мне не повезло.
Мне интересно, неверна ли привязка, но я успешно использовал CObra в других проектах, поэтому я не понимаю, как ссылаться на сгенерированный map[string]string
из Cobra.
items
иnames
в качестве переменных пакета? - person Eduardo Pereira   schedule 18.10.2019