参考资料:

1、创建 global 目录,里面存储全局变量:

1
2
3
4
5
6
7
8
9
package global

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

var (
Config *viper.Viper
)

2、创建一个 log.go 文件,用于初始化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package initialize

import (
"fmt"
"github.com/spf13/viper"
"io"
"log"
"os"
"xxx/global"
"time"
)

var (
logger *log.Logger
)

//
// @Description: 此时还没有初始化日志配置,所以就用了go自带的log库来打印日志到控制台和文件
// go log 初始化,参考自:https://www.flysnow.org/2017/05/06/go-in-action-go-log.html
//
func init() {
_ = os.Mkdir(logDir, os.ModeDir|0744)
file, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatalln("Failed to open log file: ", err)
}
logger = log.New(io.MultiWriter(os.Stderr, file), "", log.LstdFlags|log.Lshortfile)
}

//
// @Description: 初始化配置
//
func InitConfig() {
//读取配置文件
viper.SetConfigFile("./config/config.yml")
if err := viper.ReadInConfig(); err != nil {
logger.Fatalln(err)
}
viperConfig := viper.GetViper()
if err := validateConfig(viperConfig); err != nil {
logger.Fatalf("invalid configuration, error msg: %s", err)
}
// 传递给全局变量
global.Config = viperConfig
}

//
// @Description: // 校验配置文件中的必填选项是否存在
// @return error
//
func validateConfig(v *viper.Viper) {
//var (
// xxxName = v.GetString("xxx")
//)
//
//if xxxName == "" {
// logger.Fatalf("invalid xxxName: %s, please check configuration", xxxName)
//}
}

3、main 方法中加载日志配置

1
2
3
4
5
6
package main

func main() {
// 初始化日志配置
initialize.InitConfig()
}

4、做好配置的全局化以后,我们就可以通过以下命令来在项目的业务模块中使用配置了:

1
2
3
4
filterVar := global.Config.GetStringSlice("filter")
fmt.Println(filterVar)

// 除了GetStringSlice()以外,还有很多函数,针对不同数据类型,大家可以进源码查看

5、扩展

本文只是介绍了 viper 功能的冰山一角,相关还有很多亮眼的功能,方便大家读取项目配置。比如配置文件热加载,等等,感兴趣的话,大家可以根据我文首推荐的资料看一看哈。