在项目中往往将一些配置信息放到配置文件中,这样在不同的运行环境中,只需修改配置文件即可。
以下介绍两种通过第三方包获取配置文件的方式
一.通过gopkg.in/ini.v1
go get gopkg.in/ini.v1
1. 配置文件test.conf
;[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
}
运行结果:
二、github.com/larspensjo/config 读取ini配置文件
1.获取第三方包:
go get github.com/larspensjo/config
2.配置文件config.ini
[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. 获取配置文件并转成map
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. 运行和结果:
由于需要指定配置文件,故需要在命令行中运行
