将一下代码放在setting包下
package setting
import (
"github.com/spf13/viper"
)
type Setting struct {
vp *viper.Viper
}
var sections = make(map[string]interface{})
// 读取配置
func NewSetting() (*Setting, error) {
vp := viper.New()
vp.SetConfigName("config")
vp.AddConfigPath(".") //.表示根目录下,如果文件在其他包中则写包名
vp.SetConfigType("yaml")
//viper.SetConfigFile("./config.yaml") // 指定配置文件路径
//viper.SetConfigName("config") // 配置文件名称(无扩展名)
//viper.SetConfigType("yaml") // 如果配置文件的名称中没有扩展名,则需要配置此项
//viper.AddConfigPath("/etc/appname/") // 查找配置文件所在的路径
//viper.AddConfigPath("$HOME/.appname") // 多次调用以添加多个搜索路径
//viper.AddConfigPath(".") // 还可以在工作目录中查找配置
err := vp.ReadInConfig()
if err != nil {
return nil, err
}
s := &Setting{vp}
return s, nil
}
// 读取指定的一段
func (s *Setting) ReadSection(k string, v interface{}) error {
err := s.vp.UnmarshalKey(k, v)
if err != nil {
return err
}
if _, ok := sections[k]; !ok {
sections[k] = v
}
return nil
}
func (s *Setting) ReloadAllSection() error {
for k, v := range sections {
err := s.ReadSection(k, v)
if err != nil {
return err
}
}
return nil
}
在一下文件中编辑结构体接受配置信息
package config
import (
"awesomeProject/setting"
"fmt"
)
// Postgresql数据源配置
type Postgresql struct {
Username string `mapstructure:"username"`
Password string `mapstructure:"password"`
Host string `mapstructure:"host"`
Port string `mapstructure:"port"`
Database string `mapstructure:"database"`
}
type Gin struct {
Port string `mapstructure:"port"`
}
// 定义全局变量
var (
DatabaseSetting *Postgresql
WebSetting *Gin
)
// 读取配置到全局变量
func SetupSetting() error {
s, err := setting.NewSetting()
if err != nil {
return err
}
err = s.ReadSection("Database", &DatabaseSetting)
err = s.ReadSection("Gin", &WebSetting)
if err != nil {
return err
}
fmt.Println("setting:")
fmt.Println(DatabaseSetting)
return nil
}
在服务启动时调用如下
err := config.SetupSetting()
if err != nil {
return
}