> :exclamation: 踩坑:json当中带下划线的键值,无法解析到对应的struct当中,必须加上标签:mapstructure
```go
package main
import (
"fmt"
"github.com/spf13/viper"
"time"
)
// Config 所有配置;viper反序列化:mapstructure是个关键词,做序列化
type Config struct {
App AppConfig `json:"app" mapstructure:"app"`
Mysql MysqlConfig `json:"mysql" mapstructure:"mysql"`
Redis RedisConfig `json:"redis" mapstructure:"redis"`
}
type AppConfig struct {
Timezone string `json:"timezone" mapstructure:"timezone"`
RunMode string `json:"run_mode" mapstructure:"run_mode"`
}
type MysqlConfig struct {
Host string `json:"host" mapstructure:"host"`
Port string `json:"port" mapstructure:"port"`
User string `json:"user" mapstructure:"user"`
Password string `json:"password" mapstructure:"password"`
Database string `json:"database" mapstructure:"database"`
Charset string `json:"charset" mapstructure:"charset"`
MaxIdleConn int `json:"max_idle_conn" mapstructure:"max_idle_conn"` //设置空闲状态下的最大连接数
MaxOpenConn int `json:"max_open_conn" mapstructure:"max_open_conn"` //设置与数据库的最大打开连接数
ConnMaxLifetime int `json:"conn_max_lifetime" mapstructure:"conn_max_lifetime"` //设置可重复使用连接的最长时间
}
var (
GlobalConfig Config
)
func main(){
InitConfig("conf/config.local.json")
}
// InitConfig 初始化配置文件
func InitConfig(configPath string) {
config := viper.New()
config.SetConfigType("json")
if configPath != "" {
config.SetConfigFile(configPath)
} else {
config.SetConfigFile("conf/config.local.json")
}
if err := config.ReadInConfig(); err != nil {
fmt.Println("加载配置错误", err.Error())
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// 配置文件未找到错误;如果需要可以忽略
panic("未找到配置文件")
} else {
// 配置文件被找到,但产生了另外的错误
fmt.Println("读取配置文件发生其他错误", err)
panic("读取配置文件出错")
}
}
if err := config.Unmarshal(&GlobalConfig); err != nil {
fmt.Println(err)
}
fmt.Println("全部配置", GlobalConfig)
}
```
有疑问加站长微信联系(非本文作者)