嵌套结构体未能正确解析?

嵌套结构体未能正确解析?

配置文件:

https://img1.sycdn.imooc.com/climg/67654e8009c7a6a502730193.jpg


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}}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
bobby 2024-12-21 22:16:03

看起来没有什么问题,你留个qq我加你看看吧

  • 提问者 Mrxxm #1

    362190221

    2024-12-23 09:35:19
  • 提问者 Mrxxm #2

    362190221

    2024-12-23 09:36:29
  • 提问者 Mrxxm #3

    还是解析不了嵌套结构,也不知道问题出在哪里,应该是vip.Unmarshal里面的问题。

    自己只能先添加手动赋值代码了。

    https://img1.sycdn.imooc.com/climg/676d1b3b0939c04909860904.jpg

    https://img1.sycdn.imooc.com/climg/676d1b4f09fe430115920163.jpg

    2024-12-26 17:01:08
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Go开发工程师全新版
  • 参与学习       535    人
  • 解答问题       613    个

风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师