复盘配置库viper框架

Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。
main函数基本配置如下

package main

import "vipertest/core"

func main() {
    //core.InitYamlViper("./yaml.yaml")
    //core.InitTomlViper("./toml.toml")
    //core.InitJsonViper("./json.json")
    core.InitIniViper("./ini.ini")

    select {}
}

程序根目录创建几个格式的配置文件
ini格式

[database]
server=127.0.0.1
ports=8003,8004,8007

[servers.alpha]
ip=127.0.0.1

json格式

{
  "database": {
    "server": "127.0.0.1",
    "ports": [8003, 8004, 8007]
  },
  "servers": {
    "alpha": {
      "ip": "127.0.0.1"
    }
  }
}

yaml格式

database:
  server: 127.0.0.1
  ports:
    - 8003
    - 8004
    - 8007

servers:
  alpha:
    ip: 127.0.0.1

toml格式

[database]
server = "127.0.0.1"
ports = [ 8004, 8005, 8006 ]

[servers]
[servers.alpha]
ip = "127.0.0.1"

核心代码如下

package core

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

type DatabaseConfig struct {
    Server string `mapstructure:"server" json:"server" yaml:"server"`
    Ports  []int  `mapstructure:"ports" json:"ports" yaml:"ports"`
}

type ServersConfig struct {
    Alpha ServerInfo `mapstructure:"alpha" json:"alpha" yaml:"alpha"`
}

type ServerInfo struct {
    IP string `mapstructure:"ip" json:"ip" yaml:"ip"`
}

type Ini struct {
    Database DatabaseConfig `json:"database" ini:"database"`
    Servers  ServersConfig  `json:"servers" ini:"servers"`
}

var IniConf Ini

type Json struct {
    Database DatabaseConfig `json:"database"`
    Servers  ServersConfig  `json:"servers"`
}

var JsonConf Json

type Toml struct {
    Database DatabaseConfig `toml:"database"`
    Servers  ServersConfig  `toml:"servers"`
}

var TomlConf Toml

type Yaml struct {
    Database DatabaseConfig `yaml:"database"`
    Servers  ServersConfig  `yaml:"servers"`
}

var YamlConf Yaml

// InitYamlViper 解析yaml格式文件
func InitYamlViper(path string) {
    v := viper.New()
    // 指定配置文件路径
    v.SetConfigFile(path)
    // 如果配置文件的名称中没有扩展名,则需要配置此项
    v.SetConfigType("yaml")
    // 查找并读取配置文件
    err := v.ReadInConfig()
    if err != nil {
        fmt.Printf("读取配置文件错误: %s \n", err)
    }
    // 监控并重新读取配置文件
    v.WatchConfig()
    v.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("配置文件内容已更改:", e.Name)
        fmt.Println("all settings: ", v.AllSettings())
        fmt.Println("database.server: ", v.GetString("database.server"))
        fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
        fmt.Println("--------------")
        fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))

        if err = v.Unmarshal(&YamlConf); err != nil {
            fmt.Printf("重新解析配置文件失败: %s \n", err)
        }

        fmt.Printf("新配置为:%#v\n", YamlConf)
        fmt.Printf("新配置database.ports: %#v\n", YamlConf.Database.Ports)

    })

    fmt.Println("all settings: ", v.AllSettings())
    fmt.Println("database.server: ", v.GetString("database.server"))
    fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
    fmt.Println("--------------")
    fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
    if err = v.Unmarshal(&YamlConf); err != nil {
        fmt.Printf("解析配置文件失败: %s \n", err)
    }
    fmt.Printf("配置为:%#v\n", YamlConf)
    fmt.Printf("database.ports: %#v\n", YamlConf.Database.Ports)

}

// InitTomlViper 解析toml格式文件
func InitTomlViper(path string) {
    v := viper.New()
    // 指定配置文件路径
    v.SetConfigFile(path)
    // 如果配置文件的名称中没有扩展名,则需要配置此项
    v.SetConfigType("toml")
    // 查找并读取配置文件
    err := v.ReadInConfig()
    if err != nil {
        fmt.Printf("读取配置文件错误: %s \n", err)
    }
    // 监控并重新读取配置文件
    v.WatchConfig()
    v.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("配置文件内容已更改:", e.Name)
        fmt.Println("all settings: ", v.AllSettings())
        fmt.Println("database.server: ", v.GetString("database.server"))
        fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
        fmt.Println("--------------")
        fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))

        if err = v.Unmarshal(&TomlConf); err != nil {
            fmt.Printf("重新解析配置文件失败: %s \n", err)
        }
        fmt.Printf("新配置为:%#v\n", TomlConf)
        fmt.Printf("新配置database.ports: %#v\n", TomlConf.Database.Ports)

    })
    fmt.Println("all settings: ", v.AllSettings())
    fmt.Println("database.server: ", v.GetString("database.server"))
    fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
    fmt.Println("--------------")
    fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
    if err = v.Unmarshal(&TomlConf); err != nil {
        fmt.Printf("解析配置文件失败: %s \n", err)
    }
    fmt.Printf("配置为:%#v\n", TomlConf)
    fmt.Printf("database.ports: %#v\n", TomlConf.Database.Ports)
}

// InitJsonViper 解析json格式文件
func InitJsonViper(path string) {
    v := viper.New()
    // 指定配置文件路径
    v.SetConfigFile(path)
    // 如果配置文件的名称中没有扩展名,则需要配置此项
    v.SetConfigType("json")
    // 查找并读取配置文件
    err := v.ReadInConfig()
    if err != nil {
        fmt.Printf("读取配置文件错误: %s \n", err)
    }
    // 监控并重新读取配置文件
    v.WatchConfig()
    v.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("配置文件内容已更改:", e.Name)
        fmt.Println("all settings: ", v.AllSettings())
        fmt.Println("database.server: ", v.GetString("database.server"))
        fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
        fmt.Println("--------------")
        fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))

        if err = v.Unmarshal(&JsonConf); err != nil {
            fmt.Printf("重新解析配置文件失败: %s \n", err)
        }
        fmt.Printf("新配置为:%#v\n", JsonConf)
        fmt.Printf("新配置database.ports: %#v\n", JsonConf.Database.Ports)

    })
    fmt.Println("all settings: ", v.AllSettings())
    fmt.Println("database.server: ", v.GetString("database.server"))
    fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
    fmt.Println("--------------")
    fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
    if err = v.Unmarshal(&JsonConf); err != nil {
        fmt.Printf("解析配置文件失败: %s \n", err)
    }
    fmt.Printf("配置为:%#v\n", JsonConf)
    fmt.Printf("database.ports: %#v\n", JsonConf.Database.Ports)
}

// InitIniViper 解析ini格式文件
func InitIniViper(path string) {
    v := viper.New()
    // 指定配置文件路径
    v.SetConfigFile(path)
    // 如果配置文件的名称中没有扩展名,则需要配置此项
    v.SetConfigType("ini")
    // 查找并读取配置文件
    err := v.ReadInConfig()
    if err != nil {
        fmt.Printf("读取配置文件错误: %s \n", err)
    }
    // 监控并重新读取配置文件
    v.WatchConfig()
    v.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("配置文件内容已更改:", e.Name)
        fmt.Println("all settings: ", v.AllSettings())
        fmt.Println("database.server: ", v.GetString("database.server"))
        fmt.Println("database.ports: ", v.GetStringSlice("database.ports"))
        fmt.Println("--------------")
        fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))

        if err = v.Unmarshal(&IniConf); err != nil {
            fmt.Printf("重新解析配置文件失败: %s \n", err)
        }
        fmt.Printf("新配置为:%#v\n", IniConf)
        fmt.Printf("新配置database.ports: %#v\n", IniConf.Database.Ports)

    })
    fmt.Println("all settings: ", v.AllSettings())
    fmt.Println("database.server: ", v.GetString("database.server"))
    fmt.Println("database.ports: ", v.GetStringSlice("database.ports"))
    fmt.Println("--------------")
    fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
    if err = v.Unmarshal(&IniConf); err != nil {
        fmt.Printf("解析配置文件失败: %s \n", err)
    }
    fmt.Printf("配置为:%#v\n", IniConf)
    fmt.Printf("database.ports: %#v\n", IniConf.Database.Ports)
}