在项目中每每将一些配置信息放到配置文件中,这样在不一样的运行环境中,只需修改配置文件便可。git
如下介绍两种经过第三方包获取配置文件的方式github
一.经过gopkg.in/ini.v1golang
go get gopkg.in/ini.v1
1. 配置文件test.confspa
;[mqtt] mqtt_hostname = 127.0.0.1 mqtt_port = 8083 mqtt_user = admin mqtt_pass = 123456 mqtt_keepalive = 60 mqtt_timeout = 3
2. 获取配置文件并转成结构体命令行
package main import ( "log" "gopkg.in/ini.v1" ) var filepath ="D:/goproject/src/test/test.conf" type Config struct { //配置文件要经过tag来指定配置文件中的名称 MqttHostname string `ini:"mqtt_hostname"` MqttPort string `ini:"mqtt_port"` MqttUser string `ini:"mqtt_user"` MqttPass string `ini:"mqtt_pass"` MqttKeepalive int `ini:"mqtt_keepalive"` MqttTimeout int `ini:"mqtt_timeout"` } func main() { config,err := ReadConfig(filepath) //也能够经过os.arg或flag从命令行指定配置文件路径 if err != nil { log.Fatal(err) } log.Println(config) } //读取配置文件并转成结构体 func ReadConfig(path string) (Config, error) { var config Config conf, err := ini.Load(path) //加载配置文件 if err != nil { log.Println("load config file fail!") return config, err } conf.BlockMode = false err = conf.MapTo(&config) //解析成结构体 if err != nil { log.Println("mapto config file fail!") return config, err } return config, nil } 运行结果:
{127.0.0.1 8083 admin 123456 60 3}
2、github.com/larspensjo/config 读取ini配置文件code
1.获取第三方包:blog
go get github.com/larspensjo/config
2.配置文件config.iniget
[mqtt] #一级选项section #下面为option mqtt_hostname = 127.0.0.1 mqtt_port = 8083 mqtt_user = admin mqtt_pass = 123456 mqtt_keepalive = 60 mqtt_timeout = 3
3. 获取配置文件并转成mapqt
package main import ( "flag" "runtime" "log" "github.com/larspensjo/config" ) var( //https://studygolang.com/articles/686 //支持命令行输入格式为-configfile=name, 默认为config.ini //配置文件通常获取到都是类型 configFile = flag.String("configfile","config.ini","General configuration file") TOPIC = make(map[string]string) ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) flag.Parse() cfg,err := config.ReadDefault(*configFile) //读取配置文件,并返回其Config if err != nil { log.Fatalf("Fail to find %v,%v",*configFile,err) } if cfg.HasSection("mqtt") { //判断配置文件中是否有section(一级标签) options,err := cfg.SectionOptions("mqtt") //获取一级标签的全部子标签options(只有标签没有值) if err == nil { for _,v := range options{ optionValue,err := cfg.String("mqtt",v) //根据一级标签section和option获取对应的值 if err == nil { TOPIC[v] =optionValue } } } } log.Println(TOPIC) }
4. 运行和结果:string
因为须要指定配置文件,故须要在命令行中运行