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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Go 配置管理库 Viper 怎么读取结构体嵌套的配置信息?

介绍

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

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

读取结构体嵌套配置信息

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

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 个解析函数,UnmarshalUnmarshalKey,我们可以使用它们非常方便地读取多层嵌套配置信息,可以将所有或指定配置信息解析到 structmap 等数据结构中。

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

目录:

├── 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 读取嵌套配置信息,它提供两个函数 UnmarshalUnmarshalKey,分别用于解析全部配置信息,和解析指定配置信息。

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

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


目录
打赏
0
1
1
0
8
分享
相关文章
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
111 2
|
2月前
|
go语言中结构体(Struct)
go语言中结构体(Struct)
126 71
用 Go 基于 epoll 实现一个最小化的IO库
Go 语言社区中存在多个异步网络框架,如 evio、nbio、gnet 和 netpoll 等。这些框架旨在解决标准库 netpoll 的低效问题,如一个连接占用一个 goroutine 导致的资源浪费。easyio 是一个最小化的 IO 框架,核心代码不超过 500 行,仅实现 Linux 下的 epoll 和 TCP 协议。它通过 Worker Pool、Buffer 等优化提高了性能,并提供了简单的事件处理机制。
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
3月前
|
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
75 4
Go 语言的反射机制允许程序在运行时动态检查和操作类型信息,提供极大的灵活性和扩展性
Go 语言的反射机制允许程序在运行时动态检查和操作类型信息,提供极大的灵活性和扩展性。本文探讨了反射的基本原理、主要操作、应用场景及注意事项,并通过实例展示了反射的实际应用,帮助开发者更好地理解和使用这一强大特性。
58 2
|
3月前
|
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
54 3
|
3月前
|
如何在 Go 项目中隐藏敏感信息,比如避免暴露用户密码?
在Go语言开发中,用户信息管理常涉及敏感数据如密码的处理。为防止这些数据暴露给客户端,本文介绍了三种方法:使用JSON标签忽略字段、自定义序列化逻辑、使用数据传输对象(DTO),以确保用户数据的安全性。通过这些方法,可以有效控制数据输出,避免敏感信息泄露。
61 1
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
107 6
|
3月前
|
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
206 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等