Go语言读取各种配置文件
阅读原文时间:2023年07月10日阅读:1

配置文件结构体

config.go

package config

type System struct {
Mode string `mapstructure:"mode" json:"mode" ini:"mode"`
}

type Log struct {
Prefix string `mapstructure:"prefix" json:"prefix" ini:"prefix"`
LogFile bool `mapstructure:"log-file" json:"log-file" ini:"log-file" yaml:"log-file" toml:"log-file"`
Stdout string `mapstructure:"stdout" json:"stdout" ini:"stdout"`
File string `mapstructure:"file" json:"file" ini:"file"`
}

type Config struct {
System System `json:"system" ini:"system"`
Log Log `json:"log" ini:"log"`
}

全局配置

global.go

package global

import "go_dev/go_read_config/config"

var (
CONFIG = new(config.Config)
)

一、读取json

config.json

{
"system":{
"mode": "development"
},
"log": {
"prefix": "[MY-LOG] ",
"log-file": true,
"stdout": "DEBUG",
"file": "WARNING"
}
}

读取配置

package initialize

import (
"encoding/json"
"fmt"
"go_dev/go_read_config/global"
"os"
)

func InitConfigFromJson() {
// 打开文件
file, _ := os.Open("config.json")
// 关闭文件
defer file.Close()
//NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。
decoder := json.NewDecoder(file)
//Decode从输入流读取下一个json编码值并保存在v指向的值里
err := decoder.Decode(&global.CONFIG)
if err != nil {
panic(err)
}
fmt.Println(global.CONFIG)
}

二、读取ini

config.ini

[system]
mode='development'
;mode='production'

[log]
prefix='[MY-LOG] '
log-file=true
stdout=DEBUG
file=DEBUG

读取

package initialize

import (
"fmt"
"github.com/go-ini/ini"
"go_dev/go_read_config/global"
"log"
)

func InitConfigFromIni() {
err := ini.MapTo(global.CONFIG, "config.ini")
if err != nil {
log.Println(err)
return
}
fmt.Println(global.CONFIG)
}

三、读取yaml

config.yaml

system:
mode: 'development'

log:
prefix: '[MY-LOG] '
log-file: true
stdout: 'DEBUG'
file: 'DEBUG'

mylog:
level: 'debug'
prefix: '[MY-LOG]'
file_path: 'log'
file_name: 'mylog.log'
max_file_size: 10485760
max_age: 24

读取

package initialize

import (
"fmt"
"go_dev/go_read_config/global"
"gopkg.in/yaml.v2"
"io/ioutil"
)

func IniConfigFromYaml() {
file, err := ioutil.ReadFile("config.yaml")
if err != nil {
panic(err)
}
err = yaml.Unmarshal(file, global.CONFIG)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(global.CONFIG)
}

四、读取toml

config.toml

[system]
mode = 'development'

mode = 'production'

[log]
prefix = "[MY-LOG] "
log-file = true
stdout = "DEBUG"
file = "DEBUG"

读取

import (
"fmt"
"github.com/BurntSushi/toml"
"go_dev/go_read_config/global"
)

func InitConfigFromToml() {
_, err := toml.DecodeFile("config.toml", global.CONFIG)
if err != nil {
panic(err)
}
fmt.Println(global.CONFIG)
}

五、万能的viper

Viper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性:

  • 设置默认值
  • 从JSON、TOML、YAML、HCL和Java properties文件中读取配置数据
  • 可以监视配置文件的变动、重新读取配置文件
  • 从环境变量中读取配置数据
  • 从远端配置系统中读取数据,并监视它们(比如etcd、Consul)
  • 从命令参数中读物配置
  • 从buffer中读取
  • 调用函数设置配置信息

config.json

#json文件
{
"appId": "123456789",
"secret": "maple123456",
"host": {
"address": "localhost",
"port": 5799
}
}

读取

package main

import (
"fmt"
"github.com/spf13/viper"
)

//定义config结构体
type Config struct {
AppId string
Secret string
Host Host
}
//json中的嵌套对应结构体的嵌套
type Host struct {
Address string
Port int
}

func main() {
config := viper.New()
config.AddConfigPath("./kafka_demo")
config.SetConfigName("config")
config.SetConfigType("json")
if err := config.ReadInConfig(); err != nil {
panic(err)
}
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file changed:", e.Name)
if err := config.ReadInConfig(); err != nil {
panic(err)
}
})
fmt.Println(config.GetString("appId"))
fmt.Println(config.GetString("secret"))
fmt.Println(config.GetString("host.address"))
fmt.Println(config.GetString("host.port"))

//直接反序列化为Struct  
var configjson Config  
if err :=config.Unmarshal(&configjson);err !=nil{  
    fmt.Println(err)  
}

fmt.Println(configjson.Host)  
fmt.Println(configjson.AppId)  
fmt.Println(configjson.Secret)

config.yaml

log:
prefix: '[MY-LOG] '
log-file: true
stdout: 'DEBUG'
file: 'DEBUG'

config.go

type Log struct {
Prefix string `mapstructure:"prefix" json:"prefix"`
LogFile bool `mapstructure:"log-file" json:"logFile"`
Stdout string `mapstructure:"stdout" json:"stdout"`
File string `mapstructure:"file" json:"file"`
}

type Config struct {
Log Log `json:"log"`
}

global

package global

import (
oplogging "github.com/op/go-logging"
"github.com/spf13/viper"
"go_Logger/config"
)

var (
CONFIG config.Config
VP *viper.Viper
LOG *oplogging.Logger
)

读取

const defaultConfigFile = "config/config.yaml"

func init() {
v := viper.New()
v.SetConfigFile(defaultConfigFile)
err := v.ReadInConfig()
if err != nil {
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
v.WatchConfig()

v.OnConfigChange(func(e fsnotify.Event) {  
    fmt.Println("config file changed:", e.Name)  
    if err := v.Unmarshal(&global.CONFIG); err != nil {  
        fmt.Println(err)  
    }  
})  
if err := v.Unmarshal(&global.CONFIG); err != nil {  
    fmt.Println(err)  
}  
global.VP = v  

}