嵌套结构体未能正确解析?
配置文件:

config文件:
package config
type UserSrvConfig struct {
Host string `mapsstructure:"host"`
Port int `mapsstructure:"port"`
}
type ServerConfig struct {
Name string `mapsstructure:"name"`
Port int `mapsstructure:"port"`
UserSrvConfig UserSrvConfig `mapsstructure:"user_srv"`
}
配置初始化代码:
package initialize
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"shop_api/user-web/global"
)
// 1.从环境变量中获取配置
func GetEnvInfo(env string) string {
viper.AutomaticEnv()
return viper.GetString(env)
}
// 2.初始化配置文件
func InitConfig() {
debug := GetEnvInfo("SHOP")
configFilePrefix := "config"
configFileName := fmt.Sprintf("user-web/%s-pro.yaml", configFilePrefix)
if debug == "debug" {
configFileName = fmt.Sprintf("user-web/%s-debug.yaml", configFilePrefix)
}
global.GetSugar().Infof("配置文件名称:%s", configFileName)
vip := viper.New()
// 设置配置文件路径
vip.SetConfigFile(configFileName)
if err := vip.ReadInConfig(); err != nil {
panic(fmt.Errorf("无法读取配置文件: %s", err))
}
fmt.Println(vip.AllSettings(), vip.AllKeys())
// 解析配置文件内容到结构体
if err := vip.Unmarshal(&global.ServerConfig); err != nil {
global.GetSugar().Errorf("无法解析配置文件内容: %v", err)
panic(err)
}
fmt.Println(vip.AllSettings(), vip.AllKeys())
// 打印解析后的内容
global.GetSugar().Infof("配置文件内容:%+v", global.ServerConfig)
// 配置文件动态监控功能
vip.WatchConfig() // 开始监控配置文件变化
vip.OnConfigChange(func(e fsnotify.Event) {
// 配置文件发生变化时触发的事件
global.GetSugar().Infof("配置文件发生变化:%s", e.Name)
// 重新读取配置文件并反序列化
if err := vip.ReadInConfig(); err != nil {
global.GetSugar().Errorf("重新读取配置文件失败: %v", err)
return
}
if err := vip.Unmarshal(global.ServerConfig); err != nil {
global.GetSugar().Errorf("无法解析配置文件内容: %v", err)
return
}
global.GetSugar().Infof("配置文件变化后的内容:%+v", global.ServerConfig)
})
}
输出打印:(嵌套的结构体中配置为空)
2024-12-20T18:56:31.596+0800 INFO initialize/config.go:24 配置文件名称:user-web/config-debug.yaml
map[name:user-web port:8022 user_srv:map[host:127.0.0.1 port:50051]] [name port user_srv.host user_srv.port]
map[name:user-web port:8022 user_srv:map[host:127.0.0.1 port:50051]] [name port user_srv.host user_srv.port]
2024-12-20T18:56:31.598+0800 INFO initialize/config.go:42 配置文件内容:&{Name:user-web Port:8022 UserSrvConfig:{Host: Port:0}}
14
收起
正在回答 回答被采纳积分+1
Go开发工程师全新版
- 参与学习 535 人
- 解答问题 613 个
风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!
了解课程


恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星