1.安装

go get github.com/spf13/viper

2.基本使用及注意事项

config.toml文件,注意事项在程序注释中

appname = "user_web77"

loglevel = "info"
port = 8089

[mysql]
ip = "192.168.56.19"
port = 3310
user = "root"
password = 123456
database = "cmp"

[redis]
ip = "192.168.56.101"
port = 6379

[rabbitmq]
ip = "192.168.56.101"
port = 5991

程序

package main

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

type MysqlConfig struct{
    Ip string      //公有访问
    Port string
    User string
    Password string
    Database string
}

type RedisConfig struct{
    Ip string
    Port string
}

type RabbitmqConfig struct{
    Ip string
    Port string
}

type Config struct{    //Config对象和config.toml文件保持一致
    AppName string
    LogLevel string
    Port string
    Mysql MysqlConfig   //需要定义子类型对应的变量,如果不定义映射不成功
    Redis RedisConfig
    Rabbitmq RabbitmqConfig
}

func main() {
    viper.AutomaticEnv()      //获取环境变量的值
    viper.SetConfigName("config")  //定义配置文件名称
    viper.SetConfigType("toml")   //定义格式
    viper.AddConfigPath("./config/")  //定义文件路径
    viper.SetDefault("redis.port",6379)  //设置默认值
    viper.SetDefault("kafka.port",6856)
    err := viper.ReadInConfig()  //读取
    if err != nil {
        log.Fatalln("read config failed: %v",err)
    }
    viper.WatchConfig()     //监听配置文件改变  并且需要放置在viper.ReadInConfig之后
    viper.OnConfigChange(func(e fsnotify.Event) { //配置文件修改完后的回调函数
        log.Printf("Config file:%s Op:%s\n", e.Name, e.Op)
    })
    log.Println(viper.GetString("appname"))   //以string格式获取
    log.Println(viper.GetString("log_level"))
    log.Println(viper.GetString("port"))

    fmt.Println("mysql ip:",viper.GetString("mysql.ip"))
    fmt.Println("mysql port:",viper.GetString("mysql.port"))
    fmt.Println("kafka port:",viper.GetString("kafka.port"))
    fmt.Println("GOPATH: ", viper.Get("GOPATH"))
    time.Sleep(time.Second)

    var config Config
    viper.Unmarshal(&config)

    for {
        log.Println(config.LogLevel)  //通过绑定到对象上不会实时更新
        log.Println(config.AppName)
        log.Println(config.Mysql.Ip)
        fmt.Println("mysql ip:",viper.GetString("mysql.ip"))  //可以更新
        time.Sleep(time.Second * 5)
    }


}

3.结果

2021/08/03 14:31:25 info
2021/08/03 14:31:25 user_web77
2021/08/03 14:31:25 192.168.56.138
mysql ip: 192.168.56.138
2021/08/03 14:31:28 Config file:C:\Users\admin\xiayuedu\golangdemo\config\config.toml Op:WRITE
2021/08/03 14:31:28 Config file:C:\Users\admin\xiayuedu\golangdemo\config\config.toml Op:WRITE
2021/08/03 14:31:30 info
2021/08/03 14:31:30 user_web77
2021/08/03 14:31:30 192.168.56.138
mysql ip: 192.168.56.19
2021/08/03 14:31:35 info
2021/08/03 14:31:35 user_web77
2021/08/03 14:31:35 192.168.56.138
mysql ip: 192.168.56.19