• Go语言读取各种配置文件


    配置文件结构体

    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 
    ", 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
    }
    

      

  • 相关阅读:
    select 1
    使用Word2016发布CSDN博客
    使用word 2013 发布csdn博客
    使用word写CSDN博客文章
    用Word 写csdn blog
    如何使用office2016发布CSDN博客
    用word发CSDN blog
    使用word文档直接发表博客 8 )
    将Word发布到博客园
    Word 2010发布博客文章(修正)
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/12863384.html
Copyright © 2020-2023  润新知