Go中配置文件读取的几种方式
日常开发中读取配置文件包含以下几种格式:
- json 格式字符串
- K=V 键值对
- xml 文件
- yml 格式文件
- toml 格式文件
前面两种书写简单,解析过程也比较简单。xml形式书写比较累赘,yml是树形结构,为简化配置而生,toml是一种有着自己语法规则的配置文件格式,我们一一来看使用方式,各位看官自行比较哪种更加实用。
1.读取json格式的文件
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"sync"
)
type Configs map[string]json.RawMessage
var configPath string = "c:/test.json"
type MainConfig struct {
Port string `json:"port"`
Address string `json:"address"`
}
var conf *MainConfig
var confs Configs
var instanceOnce sync.Once
//从配置文件中载入json字符串
func LoadConfig(path string) (Configs, *MainConfig) {
buf, err := ioutil.ReadFile(path)
if err != nil {
log.Panicln("load config conf failed: ", err)
}
mainConfig := &MainConfig{
}
err = json.Unmarshal(buf, mainConfig)
if err != nil {
log.Panicln("decode config file failed:", string(buf), err)
}
allConfigs := make(Configs, 0)
err = json.Unmarshal(buf, &allConfigs)
if err != nil {
log.Panicln("decode config file failed:", string(buf), err)
}
return allConfigs, mainConfig
}
//初始化 可以运行多次
func SetConfig(path string) {
allConfigs, mainConfig := LoadConfig(path)
configPath = path
conf = mainConfig
confs = allConfigs
}
// 初始化,只能运行一次
func Init(path string) *MainConfig {
if conf != nil && path != configPath {
log.Printf("the config is already initialized, oldPath=%s, path=%s", configPath, path)
}
instanceOnce.Do(