0

コマンドラインでキーと値のペアの文字列として入力を受け入れるアプリケーションを 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 から生成された を参照する方法についての理解が不足しています。

4

1 に答える 1