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

简介: 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 格式不对,导致解析不出配置信息中的内容。


目录
相关文章
|
16天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
2月前
|
Go API 数据安全/隐私保护
Go语言标准库概览:构建高效、可靠的软件开发基石
【2月更文挑战第8天】Go语言标准库是Go语言生态系统的重要组成部分,它为开发者提供了一系列高效、可靠的工具和函数,帮助开发者构建高质量的软件应用。本文将对Go语言标准库进行概览,介绍其组成特点、设计哲学以及使用场景与优势,帮助读者更好地理解和应用Go语言标准库。
|
2月前
|
测试技术 Go 开发者
go-carbon v2.3.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。
27 0
|
3月前
|
关系型数据库 MySQL Go
工厂模式+自动注册管理Go多包结构体
工厂模式+自动注册管理Go多包结构体
43 1
|
3月前
|
Cloud Native 安全 Java
云原生系列Go语言篇-标准库Part 2
使用Go进行开发的最大优势之一是其标准库。与Python类似,Go也采取了“内置电池”的理念,提供了构建应用程序所需的许多工具。由于Go是一种相对较新的语言,它附带了一个专注于现代编程环境中遇到的问题的库。
23 0
|
3月前
|
存储 Go
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
本文将探讨几个热门的 go 日志库如 logrus、zap 和官网的 slog,我将分析这些库的的关键设计元素,探讨它们是如何支持日志轮转与切割功能的配置。
93 0
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
|
3月前
|
JSON Cloud Native Java
云原生系列Go语言篇-标准库Part 2
REST API将JSON奉为服务之通信的标准方式,Go 的标准库内置对Go 数据类型与 JSON 之间进行转换的支持。marshaling一词表示从 Go 数据类型转为另一种编码,而unmarshaling表示转换为 Go 数据类型。
25 0
|
2月前
|
Go 索引
Go 1.22 slices 库的更新:高效拼接、零化处理和越界插入优化
本文详细介绍了 Go 1.22 版本中 slices 库的更新内容,总结起来有三个方面:新增了 Concat 函数、对部分函数新增了零化处理的逻辑和对 Insert 函数进行了越界插入优化
92 1
Go 1.22 slices 库的更新:高效拼接、零化处理和越界插入优化
|
21天前
|
数据建模 Go vr&ar
idea配置go依赖下载
idea配置go依赖下载
16 0
|
2月前
|
Java 测试技术 Go
Go语言标准库进阶应用与最佳实践:提升代码质量与性能
【2月更文挑战第8天】在掌握了Go语言标准库的基础应用后,如何进一步发掘其潜力,提升代码质量和性能,是每位Go语言开发者所关心的问题。本文将探讨Go语言标准库的进阶应用与最佳实践,包括标准库与其他库的协同使用、性能优化与内存管理、错误处理与异常捕获、标准库在实际项目中的应用案例,以及推荐的最佳实践与编程规范。通过深入了解这些内容,开发者能够更好地利用Go语言标准库,提升代码质量与性能,构建出更加高效、可靠的软件应用。