配置文件结构体

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
}

  

Go语言读取各种配置文件的更多相关文章

  1. 读取HeidiSQL 配置文件中的密码

    读取HeidiSQL 配置文件中的密码 2017-1-21 5:42:01 codegay HeidiSQL是一款开源的SQL管理工具,用管理MYSQL,MSSQL 等数据库, 很多管理工具都会把密码 ...

  2. SpringBoot中如何优雅的读取yml配置文件?

    YAML是一种简洁的非标记语言,以数据为中心,使用空白.缩进.分行组织数据,从而使得表示更加简洁易读.本文介绍下YAML的语法和SpringBoot读取该类型配置文件的过程. 本文目录 一.YAML基 ...

  3. 在spring boot使用总结(九) 使用yaml语言来写配置文件

    yaml是专门用来写配置文件的语言.使用yaml来写配置文件扩展性比较强而且十分方便.spring boot支持使用yaml语言来写配置文件,使用snakeyaml库来读取配置文件.spring bo ...

  4. 读取.properties配置文件

    方法1 public  class SSOUtils { protected static String URL_LOGIN = "/uas/service/api/login/info&q ...

  5. java读取properties配置文件总结

    java读取properties配置文件总结 在日常项目开发和学习中,我们不免会经常用到.propeties配置文件,例如数据库c3p0连接池的配置等.而我们经常读取配置文件的方法有以下两种: (1) ...

  6. 【XML配置文件读取】使用jdom读取XML配置文件信息

    在项目中我们经常需要将配置信息写在配置文件中,而XML配置文件是常用的格式. 下面将介绍如何通过jdom来读取xml配置文件信息. 配置文件信息 <?xml version="1.0& ...

  7. Web 项目 中读取专用配置文件

    在 web 开发中,有时我们要为 业务逻辑处理 配置专用的 配置文件,也就是 xml 文件,这样可以极大的方便维护工作,但是读取 专用的配置文件还需要自己写一个方法,在这里,我封装了一个公用 的方法: ...

  8. Java读取Properties配置文件

    1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,使用键值对的形式来保存属性集.不过Properties的键和值都是字符串 ...

  9. spring读取prperties配置文件(2)

    接上篇,spring读取prperties配置文件(1),这一篇主要讲述spring如何用annotation的方式去读取自定义的配置文件. 这里我先定义好属性文件"user.propert ...

随机推荐

  1. 程序员Meme 第00期

  2. Linux用户家目录被删除救回

    一.说明 家目录被删除,如果直接新建一个目录,用户是不识别的 二.操作 1.随便先创建一个用户,需要用到他的一些文件 useradd test 2.假如admin用户的家目录没了,需要修复 cd te ...

  3. STL 较详尽总结

    STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...

  4. CF513B1 Permutations 题解

    Content 给定两个整数 \(n,m\).定义 \(f(p)=\sum\limits_{l=1}^n\sum\limits_{r=l}^n\min\limits_{i=l}^rp_i\),其中 \ ...

  5. -fno-rtti -fno-exceptions

    -fno-rtti 禁用运行时类型信息-fno-exceptions 禁用异常机制一般只有对程序运行效率及资源占用比较看重的场合才会使用, 如果要做这两个的话最好连libstdc++和其他所有的的c+ ...

  6. nim_duilib(2)之xml目录结构理解

    introduction 本文将总结我对nim_duilib的xml配置. 更多控件和控件属性的具体说明, 请参考 here before starting 1 You should clone th ...

  7. 1336 - Sigma Function

    1336 - Sigma Function   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB S ...

  8. idea使用教程-Module的概念和使用

    一.IDEA页面展示 [1]项目下内容: ➢工程下的src类似于Eclipse下的src目录,用于存放代码.. ➢工程下的.idea 和TestProject.iml文件都是IDEA工程特有的.类似于 ...

  9. InnoDB 聚集索引和非聚集索引、覆盖索引、回表、索引下推简述

    关于InnoDB 存储引擎的有聚集索引和非聚集索引,覆盖索引,回表,索引下推等概念,这些知识点比较多,也比较零碎,但是概念都是基于索引建立的,本文从索引查找数据讲述上述概念. 聚集索引和非聚集索引 在 ...

  10. 记录一次线上OOM调优经历

    现状: k8s 的一个pod 有32G内存,每秒产生新对象的峰值在900Mb ---- 1900Mb(根据jstat计算Eden区获得) . 修改之前的参数 就一个命令行参数是-Xmx31g; 我修改 ...