Go 配置管理库 Viper 怎么读取结构体嵌套的配置信息?

本文我们通过示例代码,介绍怎么使用 Viper 读取嵌套配置信息,它提供两个函数 Unmarshal​ 和 UnmarshalKey,分别用于解析全部配置信息,和解析指定配置信息。

本文我们通过示例代码,介绍怎么使用 Viper 读取嵌套配置信息,它提供两个函数 Unmarshal​ 和 UnmarshalKey,分别用于解析全部配置信息,和解析指定配置信息。

01介绍

Golang 配置信息管理库Viper[1],它提供一套完整的管理配置信息的解决方案。

Go 语言中很多知名开源项目也都选择使用 Viper,它功能非常强大,本文介绍 Viper 读取结构体嵌套配置信息的使用方式。

02读取结构体嵌套配置信息

在实际项目开发中,我们经常会遇到一些比较复杂的配置信息,比如多层嵌套的配置信息,在结构体中嵌套结构体和切片。

user_data:
  uid: 10000
  uname: "frank"
  other_info:
    email: "gopher@email.cn"
    address: "Beijing China"
  language:
    - name: "go"
      score: 90
    - name: "php"
      score: 95
    - name: "JavaScript"
      score: 80

阅读上面yaml文件,user_data是一个多层嵌套的配置信息。

读取该多层嵌套配置信息,如果我们使用GetXXX函数获取值,代码会非常繁琐。

Viper 提供了 2 个解析函数,Unmarshal和UnmarshalKey,我们可以使用它们非常方便地读取多层嵌套配置信息,可以将所有或指定配置信息解析到struct、map等数据结构中。

我们通过示例代码,介绍它们的使用方式。

目录:

├── configs
│   ├── default.yaml
│   └── test.yaml
├── go.mod
├── go.sum
└── main.go

示例代码:

package main

import (
 "fmt"
 "github.com/spf13/viper"
)

func main() {
 v := viper.New()
 //v.SetConfigFile("./configs/test.yaml")
 v.SetConfigFile("./configs/default.yaml")
 err := v.ReadInConfig()
 if err != nil {
  fmt.Println(err)
  return
 }
 //err = v.Unmarshal(&userData)
 err = v.UnmarshalKey("user_data", &userData)
 if err != nil {
  fmt.Println(err)
  return
 }
 fmt.Printf("userData=%+v\n", userData)
}

type UserData struct {
 Uid       int        `json:"uid"`
 Uname     string     `json:"uname"`
 OtherInfo OtherInfo  `json:"other_info" mapstructure:"other_info"`
 Language  []Language `json:"language" mapstructure:"language"`
}

type OtherInfo struct {
 Email   string
 Address string
}

type Language struct {
 Name  string
 Score int
}

var userData UserData

输出结果:

userData={Uid:10000 Uname:frank OtherInfo:{Email:gopher@email.cn Address:Beijing China} Language:[{Name:go Score:90} {Name:php Score:95} {Name:JavaScript Score:80}]}

阅读上面这段代码,结构体UserData中嵌套结构体OtherInfo和切片Language,我们使用 Viper 提供的 tag 标签mapstructure,将读取到的配置信息解析到struct中。

需要注意的是,解析指定配置信息使用UnmarshalKey函数,解析全部配置信息使用Unmarshal,二者的yaml文件格式也不一样,读者朋友们小心踩“坑”。

03总结

本文我们通过示例代码,介绍怎么使用 Viper 读取嵌套配置信息,它提供两个函数Unmarshal和UnmarshalKey,分别用于解析全部配置信息,和解析指定配置信息。

需要注意的是,针对结构体中的嵌套结构体类型或切片类型的字段,我们需要使用 Viper 提供的 tag 标签mapstructure,否则将无法读取到配置信息的内容。

此外,yaml 格式也需要熟练掌握,尽量不要因为 yaml 格式不对,导致解析不出配置信息中的内容。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年6月12日 17:02
下一篇 2023年6月12日 17:02

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信