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) }
正常的输出结果: