package cmd import ( "bytes" "fmt" "github.com/spf13/cobra" "io/ioutil" "standard/cobra/internal/pkg/configs" "github.com/spf13/viper" "os" "standard/cobra/internal" ) var ( localConfig string mysql_username string mysql_password string mysql_host string mysql_port int mysql_database string goroot string startCmd = &cobra.Command{ // test Use: "start", Short: "Start Server.", Run: func(cmd *cobra.Command, args []string) { start() }, } ) func init() { rootCmd.AddCommand(startCmd) // test & test args startCmd.Flags().StringVarP(&localConfig, "CONFIG", "c", "/Users/miuye/Documents/Code/GoProject/src/standard/cobra/cfg.toml", "") // start args startCmd.Flags().StringVarP(&mysql_username, "mysql_username", "u", "root", "") startCmd.Flags().StringVarP(&mysql_password, "mysql_password", "w", "", "") startCmd.Flags().StringVarP(&mysql_host, "mysql_host", "o", "127.0.0.1", "") startCmd.Flags().IntVarP(&mysql_port, "mysql_port", "p", 3306, "") startCmd.Flags().StringVarP(&mysql_database, "mysql_database", "d", "test", "") startCmd.Flags().StringVarP(&goroot, "goroot", "g", os.Getenv("GOROOT"), "") } func readConfig(data []byte) (*configs.Config, error) { v := viper.New() v.SetConfigType("toml") reader := bytes.NewReader(data) err := v.ReadConfig(reader) if err != nil { return nil, err } //将配置Unmarshal到一个结构体中,为结构体中的对应字段赋值 cfg := &configs.Config{} if err := v.Unmarshal(cfg); err != nil { return nil, err } return cfg, nil } func start(){ //从io.Reader中读取中读取配置,来源可以是文件,也可以是程序中生成的字符串,甚至可以从网络连接中读取的字节流 data, err := ioutil.ReadFile(localConfig) if err != nil { fmt.Println("Error: get config data error: ", err) return } config, err := readConfig(data) if err != nil { fmt.Println("Error: read config error: ", err) return } fmt.Println("port",config.Mysql.Port) run(config) } func run(config *configs.Config){ internal.Serve(config) }