利用结构体进行viper读取配置
1、导入对应的包
go get github.com/spf13/viper
2、初始化viper
这里我们利用分包的思想 在main页面下导入viper
package main
import (
"fmt"
"handitem/xxb-gin-web/global"
"handitem/xxb-gin-web/initilization"
)
func main() {
initilization.InitViper()
fmt.Println(global.Config.Database.Mysql.Username)
}
在项目下面创建initilization包,包下创建init_viper.go文件。
● Unmarshal 方法使用来将读取的配置文件注入到结构体中
● OnConfigChange 这个方法是每次只要我们改动了配置文件,就会再一次将读取的文件注入结构体中
package initilization
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"handitem/xxb-gin-web/global"
"os"
)
func InitViper() {
//获取项目的执行路径
path, err := os.Getwd()
if err != nil {
panic(err)
}
config := viper.New()
// 这里我的配置文件就放在了 项目文件包下 所以只需要一个文件执行路径就行
config.AddConfigPath(path) //设置读取的文件路径
config.SetConfigName("application") //设置读取的文件名
config.SetConfigType("yaml") //设置文件的类型
//尝试进行配置读取
if err := config.ReadInConfig(); err != nil {
panic(err)
}
config.WatchConfig()
//这是改动了就会自动注入
config.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file changed:", e.Name)
if err = config.Unmarshal(&global.Config); err != nil {
fmt.Println(err)
}
})
// 这里才是把yaml配置文件解析放入到Config对象的过程---map---config
if err = config.Unmarshal(&global.Config); err != nil {
fmt.Println(err)
}
}
在项目文件包下创建global包,包下创建global.go文件,这个全局包的作用的是,以后在使用的时候直接用包点Config就可以拿到所有配置文件的属性。
package global
import (
"handitem/xxb-gin-web/commons/parse"
"sync"
)
var (
//Log *zap.Logger
// Lock sync.RWMutex
Config *parse.Config
//KSD_DB *gorm.DB
)
在项目文件包下创建commons,commons包下创建parse包,parse包下创建Config.go
该文件下是定义中的配置结构体,以后有需要配置的文件的一级结构体就放在这里
每个结构体后面都不需要加这个mapstructure、yaml 就可以直接拿取配置文件的信息
`mapstructure:"nosql" json:"nosql" yaml:"nosql"`
package parse
// 配置接下入口
type Config struct {
Database Database
NoSQL NoSQL
}
parse包下创建Database.go
package parse
type NoSQL struct {
Redis Redis
ES ES
}
// ES配置
type ES struct {
Host string
Port string
Password string
}
// redis配置
type Redis struct {
Host string
Port string
Dbname string
Password string `mapstructure:"password" json:"password" yaml:"password"`
}
在全局包下创建 application.yaml文件
nosql数据的配置
nosql:
redis:
host: 127.0.0.1
port: 6379
password: 123
db: 0
es:
host: 127.0.0.1
port: 9300
password: 456
mapstructure字段的作用 yaml