golang 读取yaml配置文件中的数据 两种方式:yaml.v2 和 Viper

2023-11-17

golang 读取yaml配置文件中的数据

yaml 配置文件 config.yaml 中 写数据:

app:
  host: 127.0.0.1
  port: 3306
  username: admin
  password: admin
log:
  suffix: log
  maxSize: 5

config 文件 下 是 配置文件对应的结构体 config.go

package config

type Config struct {
	App App `yaml:"app" json:"app"`
	Log Log `yaml:"log" json:"log"`
}

下面是 具体的结构体 app.golog.go

type App struct {
	Host     string `yaml:"host" json:"host"`
	Port     int    `yaml:"port" json:"port"`
	Username string `yaml:"username" json:"username"`
	Password string `yaml:"password" json:"password"`
}

type Log struct {
	Suffix  string `yaml:"suffix" json:"suffix"`
	MaxSize int    `yaml:"maxSize" json:"maxsize"`
}

这种写结构体的方法比较有层级,后续配置文件需要增加数据,可以对不同的配置用不同的结构体,使用起来不会杂乱;

方法一: 使用yaml.v2 读取配置文件数据,需要导入对应的包 :yaml.v2
需要注意的是:yaml.v2只能读取yaml格式的文件

import (
	"gopkg.in/yaml.v2"
)

使用命令:go get gopkg.in/yaml.v2 导入对应 的包。

使用ioutil导入配置文件,使用yaml.Unmarshal将配置文件读取到结构体中,示例代码如下。

package main

import (
	"GoReadConfig/config"
	"fmt"
	"gopkg.in/yaml.v2"
	"io/ioutil"
)

func GetConfigData() {
	//导入配置文件
	yamlFile, err := ioutil.ReadFile("./config.yml")
	if err != nil {
		fmt.Println(err.Error())
	}
	var _config *config.Config
	//将配置文件读取到结构体中
	err = yaml.Unmarshal(yamlFile, &_config)
	if err != nil {
		fmt.Println(err.Error())
	}
	username := _config.App.Username
	fmt.Println("username:" + username )
	fmt.Printf("config.log: %#v\n", _config.Log)

}

func main() {
	GetConfigData()
}

方法二:使用Viper读取配置文件数据
Viper可以处理多种格式的配置,目前已支持从JSON、TOML、YAML、HCL、INI和Java properties文件中读取配置数据。

Viper还能监视配置文件的变动、重新读取配置文件。在项目中可以用作热加载

1.导入 Viper .
go get github.com/spf13/viper

2.使用Viper导入配置文件,并将配置文件读取到结构体中,示例代码如下:

package main

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

func GetConfigData() {
	//导入配置文件
	viper.SetConfigType("yaml")
	viper.SetConfigFile("./config.yml")
	//读取配置文件
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err.Error())
	}
	var _config *config.Config
	//将配置文件读到结构体中
	err = viper.Unmarshal(&_config)
	if err != nil {
		fmt.Println(err.Error())
	}
	
	username := _config.App.Username
	fmt.Println("username:" + username )
	fmt.Printf("config.log: %#v\n", _config.Log)
}

func main() {
	GetConfigData()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang 读取yaml配置文件中的数据 两种方式:yaml.v2 和 Viper 的相关文章

  • 意外的令牌:尝试解析 JSON 字符串时

    我正在尝试解析这个 JSON 字符串 RESULTS name Thessaloniki GR type Sailing l sailing weather beach Porto 20Carras 20Marina 45904 name
  • 从 JSON 文件注入的编译指令 AngularJS

    希望有人能帮助我应对这一挑战 我使用以下命令从服务器请求 JSON 数据 http get 来自服务器的数据返回一个对象 对象中的一个值包含 HTML 标记 该标记使用以下方式注入到页面中 div div 在标记内 有一个名为的自定义指令
  • 使用 javax/json,如何将元素添加到现有的 JsonArray 中?

    我从文件中读取了一个 JSON 数组 但我想向该数组中添加其他条目 我将如何使用 javax json 库来做到这一点 private String getJson FileInputStream fis throws IOExceptio
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 使用 Python 将对象列表转为 JSON

    我在转换时遇到问题Object实例到 JSON ob Object list name scaping myObj base url u number page for ob in list name json string json du
  • C# Newtonsoft 反序列化 JSON 数组

    我正在尝试使用 Newtonsoft 反序列化数组 以便我可以在列表框中显示来自基于云的服务器的文件 但无论我尝试什么 我总是会收到此错误 Newtonsoft Json JsonReaderException 解析值时遇到意外字符 路径
  • Flutter:将字符串转换为 Map

    我正在使用 SQFlite 在本地存储数据 我有一个表 其中有一个名为 json 的字段 该字段的类型为 TEXT 并存储转换为字符串的 json 例如 name Eduardo Age 23 性别男 到目前为止 一切正常 但随后我需要从数
  • 通过 json 模式 Sequelize 定义模型

    我想通过json制作Sequelize模型广告 我在文档中找不到是否可以通过 json 模式进行模型声明 对于这么强大的库 没有这样的功能很奇怪 也许我找错地方了 只是试图找到同一问题的答案 模式示例 类型 对象 模式 http json
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • 如何使用shell脚本从json字符串中grep特定字段值[重复]

    这个问题在这里已经有答案了 下面是文件中可用的 JSON 字符串 我需要从中提取值status在 shell 脚本中 预期输出 status success 响应 json eventDate null dateProccessed nul
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何反序列化键名.Net中包含点(.)的Json字符串[重复]

    这个问题在这里已经有答案了 odata metadata sometext odata nextLink sometext value odata type SP Data RegionsListItem odata id 07404daa
  • Rails 3.2:用 json 序列化中的空字符串替换 null 值

    我正在使用 Rails 3 2序列化 http www simonecarletti com blog 2010 04 inside ruby on rails serializing ruby objects with json 将 ru
  • SQL Server OPENJSON读取嵌套json

    我有一些想要在 SQL Server 2016 中解析的 json 有一个项目 gt 结构 gt 属性的层次结构 我想编写一个解析整个层次结构的查询 但我不想通过索引号指定任何元素 即我不想做这样的事情 openjson json 0 or
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 从 JSON 响应中删除元素

    我有一个 JSON 字符串 我希望能够从中删除一些数据 以下是 JSON 响应 ResponseType VirtualBill Response BillHeader BillId 7134 DocumentId MN003 052206
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • 从 Twitter API 2.0 获取 user.fields 时出现问题

    我想从 Twitter API 2 0 端点加载推文 并尝试获取标准字段 作者 文本 和一些扩展字段 尤其是 用户 字段 端点和参数的定义工作没有错误 在生成的 json 中 我只找到标准字段 但没有找到所需的 user fields 用户

随机推荐

  • c语言协程[1]_基础协程实现

    协程的本质是利用程序语言语法来实现逻辑上的多任务的编程 很多年前 我在小单片机上一直想跑操作系统 奈何Flash和RAM一直没有合适的 后来想自己怼个操作系统 结果拖延症犯了 到现在也无果 rtt freertos真香 后来一直在想有啥更好
  • devtools热更新报错 javax.management.InstanceAlreadyExistsException: org.springframework.boot:type=Admin

    项目场景 spring boot version 2 4 2 spring cloud version 2020 0 1 spring cloud alibaba version 2021 1 问题描述 在配置过devtools热更新之后
  • (zz)I/O PAD design

    http tw myblog yahoo com Calvin Horng article mid 1272 next 1257 l f fid 5 同事設計一塊電路板 不知道為什麼一通電 主要的IC開始發燙起來 我看了一看IC的Datas
  • fastreport designer.exe界面设置为中文

    fastreport 安装好后 界面默认是英文 在安装时我明明选择了安装中文语言包的 打开designer exe后显示的还是英文 原来要显示中文是需要设置designer exe的 设置如下 1 菜单栏 File gt Select La
  • C语言系列:6、结构

    C语言系列 6 结构 文章目录 C语言系列 6 结构 1 结构的基本知识 2 结构和函数 3 结构数组 4 指向结构的指针 5 自引用结构 6 表查找 7 类型定义 8 联合 9 位字段 结构是一个或多个变量的集合 这些变量可能为不同的类型
  • KEIL仿真调试问题

    Q1 如何使用keil调试程序 A1 第一个表示跳转到下一个程序状态 第二个表示跳转到下一行 在主程序中的时候也是直接跳转到主程序的下一行 第三个表示 watch窗口可以查看变量的数值 Q2 使用MDK进行软件设计时没有使用ST官方的模板而
  • js中async与await详解

    引言 JavaScript 是一门基于事件驱动和异步编程的语言 而异步编程是 JavaScript 中最常用的编程方式之一 在异步编程中 我们通常使用回调函数或 Promise 对象来处理异步操作的结果 而在 ES2017 中 引入了 as
  • JDBC连接mysql数据库

    JDBC连接mysql数据库 JDBC 使用java语言操作关系数据库的一套API 是一套标准接口 可以操作不同的关系型数据库 先复习一下 在idea里面输出hello public static void main String args
  • 在Docker中安装Gitea

    目录 在Docker中安装Gitea 1 拉取最新Gitea官方镜像 2 实例化一个Gitea容器 3 Gitea需要数据源 因此使用mysql作为后端数据库 4 在mysql中创建一个新数据库 起名gitea 5 访问Gitea主页htt
  • 每日刷题-6

    目录 一 选择题 二 算法题 1 Fibonacci数列 2 合法括号序列判断 一 选择题 1 解析 内联函数是一种可以提高函数执行效率的方法 它的原理是编译时在函数调用点直接展开函数体的代码 从而避免了函数调用的开销 但是 内联函数也有一
  • 单链表排序操作

    单链表排序操作 单链表是常见的一种数据结构 它由一系列节点组成 每个节点包含一个数据元素和一个指向下一个节点的指针 在实际开发中 我们经常需要对单链表进行排序操作 以满足不同的需求 在进行单链表的排序操作时 我们可以采用多种方法 下面将介绍
  • 10个值得前端收藏的CSS3动效库(工具)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 现在的网站和App的设计中越来越重视用户体验 而优秀的动效则能使你的应用更具交互性 从而吸引更多用户的使用 我一般会在网站中加入一些简单而一致的动效 我所用的技术则是用SA
  • Python 3.打开摄像头,保存AVI视频 OpenCV Linux

    import cv2 import numpy as np from matplotlib import pylab as plt img cv2 imread pic1 png 2 plt imshow img cmap gray int
  • C练题笔记之:Leetcode-565. 数组嵌套

    题目 索引从0开始长度为N的数组A 包含0到N 1的所有整数 找到最大的集合S并返回其大小 其中 S i A i A A i A A A i 且遵守以下的规则 假设选择索引为i的元素A i 为S的第一个元素 S的下一个元素应该是A A i
  • 栈的 创建,入栈,出栈,清空栈,遍历栈 的实现

    数据结构 的学习视频 https www bilibili com video av6159200 from search seid 6709590585276522157 一 算法 栈 数据进出 类向箱子放东西和拿东西 先进后出 或者说后
  • OpenGL Vertex Buffer Objects(VBOs)

    OpenGL Vertex Buffer Objects VBOs 分类 OpenGL2010 05 20 12 53 3714人阅读 评论 13 收藏 举报 buffer float list struct 存储 工作 原创文章转载请注明
  • python 异常之 ValueError: invalid literal for int() with base 10: ‘xxx‘

    文章目录 1 异常例子 2 源代码 3 int x base 的正确使用方法 1 异常例子 代码 if name main print int 123 print int aaa 执行代码 2 源代码 可以看到 在执行 print int
  • LINUX 防火墙iptables常用指令

    封单个IP的命令 iptables I INPUT s 124 115 0 199 j DROP 封IP段的命令 iptables I INPUT s 124 115 0 0 16 j DROP 封整个段的命令 iptables I INP
  • “字符串的展开”【题解】

    字符串的展开 的题目 题目 题目描述 在初赛普及组的 阅读程序写结果 的问题中 我们曾给出一个字符串展开的例子 如果在输入的字符串中 含有类似于 d h 或者 4 8 的字串 我们就把它当作一种简写 输出时 用连续递增的字母或数字串替代其中
  • golang 读取yaml配置文件中的数据 两种方式:yaml.v2 和 Viper

    golang 读取yaml配置文件中的数据 yaml 配置文件 config yaml 中 写数据 app host 127 0 0 1 port 3306 username admin password admin log suffix