golang读取配置文件

在项目中每每将一些配置信息放到配置文件中,这样在不一样的运行环境中,只需修改配置文件便可。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

因为须要指定配置文件,故须要在命令行中运行