viper实战教程
本文将介绍一个基于viper读取配置文件的小demo。
下面是目录结构:
创建配置文件
在config下的config.yaml文件下添加以下内容
Server:
RunMode: debug
HttpPort: :8080
ReadTimeout: 60
WriteTimeout: 60
App:
DefaultPageSize: 10
MaxPageSize: 100
LogSavePath: storage/logs
LogFileName: tools
LogFileExt: .log
Database:
DBType: mysql
Username: root # 填写你的数据库账号
Password: root # 填写你的数据库密码
Host: 127.0.0.1:3306
DBName: douyin
TablePrefix: blog_
Charset: utf8
ParseTime: True
MaxIdleConns: 10
MaxOpenConns: 30
在global文件夹下添加setting.go文件,并添加以下内容
package global
import "studyviper/setting"
var (
ServerSetting *setting.ServerSettingS
AppSetting *setting.AppSettingS
DatabaseSetting *setting.DatabaseSettingS
)
添加global文件时把几个类实例化为全局变量,方便将来其他需要的方法调用。
创建配置类
创建配置类的目的是把配置文件中的属性加载如实体类里面,方便其他程序进行读取配置信息的操作。
在setting文件夹下的section.go文件夹下添加下面的内容:
package setting
import "time"
type ServerSettingS struct {
RunMode string
HttpPort string
ReadTimeout time.Duration
WriteTimeout time.Duration
}
type AppSettingS struct {
DefaultPageSize int
MaxPageSize int
LogSavePath string
LogFileName string
LogFileExt string
}
type DatabaseSettingS struct {
DBType string
UserName string
Password string
Host string
DBName string
TablePrefix string
Charset string
ParseTime bool
MaxIdleConns int
MaxOpenConns int
}
添加配置规则
添加配置规则是为了让viper结构化的读取配置文件的信息,省略繁琐的手工步骤。
在setting文件夹下的setting.go文件下添加以下内容:
package setting
import "github.com/spf13/viper"
type Setting struct {
vp *viper.Viper
}
// 实例化setting对象
func NewSetting() (*Setting, error) {
vp := viper.New() //创建viper对象
vp.SetConfigName("config") //配置文件的名称
vp.AddConfigPath("./config/")
vp.SetConfigType("yaml") //配置文件的拓展名
err := vp.ReadInConfig() //读取配置文件的内容
if err != nil {
return nil, err
}
return &Setting{vp}, nil
}
//可以选择 Unmarshaling 所有的值或特定得值到 struct,map
func (s *Setting) ReadSection(k string, v interface{}) error {
err := s.vp.UnmarshalKey(k, v)
if err != nil {
return err
}
return nil
}
测试启动类
编写main方法,查看程序是否按照期望进行输出。
在main.go文件添加以下内容
package main
import (
"fmt"
"studyviper/global"
"studyviper/setting"
)
func main() {
setting, err := setting.NewSetting()
if err != nil {
fmt.Println("初始化viper出错")
}
err = setting.ReadSection("Server", &global.ServerSetting)
if err != nil {
fmt.Println("读取Server配置出错")
}
fmt.Println(global.ServerSetting)
err = setting.ReadSection("App", &global.AppSetting)
if err != nil {
fmt.Println("读取APP配置出错")
}
fmt.Println(global.AppSetting)
err = setting.ReadSection("Database", &global.DatabaseSetting)
if err != nil {
fmt.Println("读取Database配置出错")
}
fmt.Println(global.DatabaseSetting)
}
正常的输出结果: