loraserver 源码解析 (三) 配置

loraserver 由 cobra 完成 配置


参考 golang命令行库cobra的使用


为了方便理解 loraserver 的配置

我这里利用 cobra 生成一个简单的配置程序


cobra init cfgdemo

假定我写了下面的配置文件。  toml格式的文件是cobra原生支持的

[GENERAL] #大小写忽略
log_level = 42

[redis]
url="redis://localhost:6379"

# 空格 被忽略 不参与解析
      [network_server]
    net_id="000000"

  # 多层嵌套  
  [network_server.band]
  name="EU_863_870"

[network_server.api]
bind="i am bind"

我只要依照上面配置文件的结构定义一个结构体,就可以借助 viper 解析出来

~/go/gopath/src/cfgdemo $ cat config/config.go 
package config

type Config struct {
	General struct {
		LogLevel int `mapstructure:"log_level"`
	}

	Redis struct {
		URL  string `mapstructure:"url"`
	}
	
	NetworkServer struct {
		NetID string `mapstructure:"net_id"`

		Band struct {
			Name string 
		}

		Api struct {
			Bind string 
		}
		
	}	`mapstructure:"network_server"`
}

var C Config

NetworkServer 用于解析 network_server

需要加上

扫描二维码关注公众号,回复: 2207038 查看本文章

`mapstructure:"network_server"`

func initConfig() {
	if cfgFile != "" {
		b, err := ioutil.ReadFile(cfgFile)
		if err != nil {
			log.WithError(err).WithField("config", cfgFile).Fatal("error loading config file")
		}
		viper.SetConfigType("toml")
		if err := viper.ReadConfig(bytes.NewBuffer(b)); err != nil {
			log.WithError(err).WithField("config", cfgFile).Fatal("error loading config file")
		}
	} else {
		viper.SetConfigName("cfgdemo")
		viper.AddConfigPath(".")
		if err := viper.ReadInConfig(); err != nil {
			switch err.(type) {
			case viper.ConfigFileNotFoundError:
				log.Warning("No configuration file found, using defaults.")
			default:
				log.WithError(err).Fatal("read configuration file error")
			}
		}
	}
        // Unmarshal 一下就可以把 cfgdemo.toml 的配置转换成config.C结构体变量 很方便啊~~~~

	if err := viper.Unmarshal(&config.C); err != nil {
		log.WithError(err).Fatal("unmarshal config error")
	}

	log.Print(config.C)
}

可以在 init函数里 指定 初值

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/.cfgdemo.yaml)")

	// 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.SetDefault("General.log_level", 2)
	viper.SetDefault("network_server.net_id", "000000")
	viper.SetDefault("network_server.band.name", "EU_863_870")
	viper.SetDefault("network_server.api.bind", "0.0.0.0:8000")
}
~/go/gopath/src/cfgdemo $ go run main.go 
INFO[0000] {{42} {redis://localhost:6379} {000000 {EU_863_870} {i am bind}}} 

loraserver 的配置解析差不多就是这个样子,只是它的结构体复杂一些


猜你喜欢

转载自blog.csdn.net/wangjunsheng/article/details/80860172
今日推荐