1

我一直在尝试通过解组我的 json 文件来提取一些 JSON,但是,我不知道为什么它没有发生。我能够使用viper.AllSettings()但不能通过解组来获取数据。我认为我犯了一个愚蠢的错误,请分享您的想法。github链接是-https: //github.com/parthw/100-days-of-code/tree/main/golang/d6-cobra-viper-continued,代码如下。

main.go

package main

import (
    "fmt"

    "example.com/cobra-viper/cmd"
    "github.com/spf13/viper"
)

// Myconfig example
type Myconfig struct {
    username string `mapstructure:"username"`
}

func main() {
    cmd.Execute()
    fmt.Println("I can print this ", viper.AllSettings())
    var mc Myconfig
    if err := viper.Unmarshal(&mc); err != nil {
        fmt.Println(err)
    }
    fmt.Println(mc)
}

在 cmd 目录中使用 cobra CLI 生成的代码:

package cmd

import (
    "fmt"
    "os"

    "github.com/spf13/cobra"

    homedir "github.com/mitchellh/go-homedir"
    "github.com/spf13/viper"
)

var (
    cfgFile string
    author  string
)

// Myconfig example
type Myconfig struct {
    username string
}

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
    Use:   "cobra-viper",
    Short: "A brief description of your application",
    Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
    // Uncomment the following line if your bare application
    // has an action associated with it:
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("Welcome to rootcmd")

        var mc Myconfig
        if err := viper.Unmarshal(&mc); err != nil {
            fmt.Println(err)
        }
        fmt.Println(mc)
        fmt.Println("I can print this ", viper.AllSettings())
    },
}

// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
    if err := rootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println("I can print this ", viper.AllSettings())
}

func init() {
    cobra.OnInitialize(initConfig)

    // Here you will define your flags and configuration settings.
    // Cobra supports persistent flags, which, if defined here,
    // will be global for your application.

    rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra-viper.json)")
    //rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution")

    // Cobra also supports local flags, which will only run
    // when this action is called directly.
    //rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
    //viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))

}

// initConfig reads in config file and ENV variables if set.
func initConfig() {
    if cfgFile != "" {
        // Use config file from the flag.
        viper.SetConfigFile(cfgFile)
    } else {
        // Find home directory.
        home, err := homedir.Dir()
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }

        // Search config in home directory with name ".cobra-viper" (without extension).
        viper.AddConfigPath(home)
        viper.SetConfigName(".cobra-viper")
    }

    viper.AutomaticEnv() // read in environment variables that match

    // If a config file is found, read it in.
    if err := viper.ReadInConfig(); err == nil {
        fmt.Println("Using config file:", viper.ConfigFileUsed())
    }

}

输出:

~/Documents/personal-git/100-days-of-code/golang/d6-cobra-viper-continued(main*) » go run main.go                                                                                   
Using config file: /Users/parth/.cobra-viper.json
Welcome to rootcmd
{}
I can print this  map[username:parth-wadhwa]
I can print this  map[username:parth-wadhwa]
I can print this  map[username:parth-wadhwa]
{}

JSON文件:

~/Documents/personal-git/100-days-of-code/golang/d6-cobra-viper-continued(main*) » cat /Users/parth/.cobra-viper.json                                                              

{
  "username": "parth-wadhwa"
}
4

1 回答 1

5

您的问题归结为一个事实,即您的结构中的username字段是否已导出。MyConfig它需要大写才能“导出”Unmarshal以将值解码到结构中。

type Myconfig struct {
    Username string `mapstructure:"username"`
}

您可以查看JSON 并处理未导出的字段,以更多地了解json包需要它的原因。

于 2020-11-19T19:55:14.423 回答