当前位置: 首页 > news >正文

golang yaml 解析问题

golang 中解析 yaml 格式内容可以使用 yaml.v3 库来解决。下载 go 依赖

go get -u gopkg.in/yaml.v3

1. 示例 yaml 数据

config_mail_template:description: 验证码one: Verification Codeother: Verification Codeconfig_mail_template_reset_code:description: 重置密码one: Reset passwordother: Reset password# 注释内容1
config_custom_tag: # 注释内容2description: 自定义one: Custom Tagother: Custom Tag#注释内容3

2. 普通解析

普通解析流程,解析到 map 对象,会失去对 key 的定义顺序

package yaml_demoimport ("os""testing""gopkg.in/yaml.v3"
)type Asset struct {Description string `yaml:"description"`One         string `yaml:"one"`Other       string `yaml:"other"`
}func TestParseNormal(t *testing.T) {file, err := os.ReadFile("data.yaml")if err != nil {t.Error(err.Error())return}var assets map[string]Asseterr = yaml.Unmarshal(file, &assets)if err != nil {t.Error(err.Error())return}t.Log(len(assets))
}

3. 顺序解析 yaml 中的 key

yaml3 定义了 yaml.Node 对象
第一种方式
可以通过实现 UnmarshalYAML() 接口,来实现自定义对象的解析,并且保证解析 key 的顺序性

第二种方式
直接将 bytes 解析到 yaml.Node 中,此时 yaml.Node 就是文档对象

var node yaml.Node
yaml.Unmarshal(bytes,&node)
package yaml_demoimport ("gopkg.in/yaml.v3""os""testing"
)type Item struct {Name        stringDescription string `yaml:"description"`One         string `yaml:"one"`Other       string `yaml:"other"`
}type Items []Item// UnmarshalYAML 自定义解析
func (a *Items) UnmarshalYAML(value *yaml.Node) error {for i := 0; i < len(value.Content); i += 2 {var item Itemif err := value.Content[i+1].Decode(&item); err != nil {return err}item.Name = value.Content[i].Value*a = append(*a, item)}return nil
}func TestParseToSlice(t *testing.T) {bytes, err := os.ReadFile("data.yaml")if err != nil {t.Error(err.Error())return}var items Itemserr = yaml.Unmarshal(bytes, &items)if err != nil {t.Error(err.Error())return}t.Log(len(items))
}

4. 顺序解析后回写问题

yaml 中的 node 在更新完成后,回写内容时,虽然保留了注释,但是会去掉空白行
为了保证和原来的文件相同的空白行和注释内容,可以对 yaml 内容做如下处理

  1. 将 yaml 文件读取到 bytes.Buffer 中,并对其中的空白行处理,使用占位符替代空白??行,例如使用 “#placehold” 字符串,因为 “#” 是 yaml 中的注释,所以对文件内容本身没有影响
  2. 将 bytes.Buffer 中的内容解析成 yaml.Node 对象,并对其中需要更新的内容进行更新
  3. 回写时,首先使用 yaml.Marshal 将 yaml.Node 对象转换成 bytes.Buffer,然后将占位符再替换回换行符,写入文件
// 加载 yaml 文件,将空白行使用占位符替换
func loadYamlNode(file string) (*yaml.Node, error) {dataBytes, err := os.ReadFile(file)if err != nil {return nil, err}buffer := bytes.NewBuffer(dataBytes)storeBytes := make([]byte, 0, 2*buffer.Len())storeBuffer := bytes.NewBuffer(storeBytes)for {line, err := buffer.ReadString('\n')if err != nil && err == io.EOF {break}if line != "\n" {storeBuffer.WriteString(line)} else {storeBuffer.WriteString("#placehold\n")}}var dataNode yaml.Nodeerr = yaml.Unmarshal(storeBuffer.Bytes(), &dataNode)if err != nil {return nil, err}return &dataNode, nil
}// 回写更新内容,将占位符使用空白行替换
func saveUpdatedContent(docNode *yaml.Node, file string) error {var bytesData []bytebuffer := bytes.NewBuffer(bytesData)encoder := yaml.NewEncoder(buffer)encoder.SetIndent(2)err := encoder.Encode(docNode)if err != nil {return err}store := make([]byte, 0, buffer.Len())storeBuffer := bytes.NewBuffer(store)for {line, err := buffer.ReadString('\n')if err != nil && err == io.EOF {break}if line == "#placehold\n" {storeBuffer.WriteString("\n")} else {storeBuffer.WriteString(line)}}err = os.WriteFile(file, storeBuffer.Bytes(), 0666)return err
}

相关文章:

golang yaml 解析问题

golang 中解析 yaml 格式内容可以使用 yaml.v3 库来解决。下载 go 依赖 go get -u gopkg.in/yaml.v31. 示例 yaml 数据 config_mail_template:description: 验证码one: Verification Codeother: Verification Codeconfig_mail_template_reset_code:description: 重置密码one:…...

setContentHuggingPriority和setContentCompressionResistancePriority的使用

需求&#xff1a; 两个label并排显示&#xff0c;文字内容由服务器返回&#xff0c;label宽度以文字内容自适应&#xff0c;label之间间距大于等于10. 需要考虑以下情况&#xff1a; 当两个label的宽度和 < 屏幕宽度时&#xff0c;各自设置约束&#xff0c;无需处理&#…...

java springboot yml文件配置 多环境yml

如果是properties改用yml&#xff0c;直接改后缀&#xff0c;原文件中的配置语法改用yml的语法即可&#xff0c;系统会自动扫描application.properties和application.yml文件&#xff08;注意&#xff1a;改了之后需要maven 命令 clean一下&#xff0c;清个缓存&#xff09;。 …...

DMBOK知识梳理for CDGA/CDGP——第一章数据管理(附常考知识点)

第一章 数据管理 第一章在 CDGA|CDGP考试中分值占比均不是很高&#xff0c;主要侧重点是考概念性的知识&#xff0c;理解数据管理的目标原则、还有与其他概念的区别点&#xff0c;同时掌握几个关键核心的图&#xff08;车轮图、六边形图、语境关系图&#xff09;。总体来说难度…...

065:cesium设置带有箭头的线材质(material-9)

第065个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置带有箭头的线材质,请参考源代码,了解PolylineArrowMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共82行)相关API参考…...

Java常用API

1 常用API API(:Application Programming Interface ):应用程序编程接口1.1 Math类 Math中没有构造方法,类的成员都是静态的(static修饰),通过类名就可以直接调用常用方法方法名说明public static int abs(int a)获取参数a的绝对值public static double ceil(double a) …...

【C++ 学习 ⑥】- C++ 动态内存管理详解

目录 一、new 表达式和 delete 表达式的工作机理 二、operator new 和 operator delete 函数 2.1 - 标准库定义 2.2 - 重载 三、定位 new 表达式 四、常见面试题 4.1 - malloc/free 和 new/delete 的区别 4.2 - 内存泄漏 在 C 中&#xff0c;new 和 delete 既是关键字&…...

【5.21】六、自动化测试—常见技术

目录 6.2 自动化测试常见技术 1. 录制与回放测试 2. 脚本测试 3. 数据驱动测试 6.2 自动化测试常见技术 自动化测试技术有很多种&#xff0c;这里介绍3种常见的技术&#xff1a; 1. 录制与回放测试 录制是指使用自动化测试工具对桌面应用程序或者是Web页面的某一项功能进…...

JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环

JavaScript中的事件循环机制是JavaScript运行引擎的核心之一&#xff0c;它决定了代码的执行方式和效率。本文将从几个方面介绍JavaScript中的事件循环机制&#xff0c;包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环。 一、事件循环的原理 事…...

【华为OD机试c++】解压报文【2023 B卷 |200分】

题目描述 为了提升数据传输的效率&#xff0c;会对传输的报文进行压缩处理。 输入一个压缩后的报文&#xff0c;请返回它解压后的原始报文。 压缩规则&#xff1a;n[str]&#xff0c;表示方括号内部的 str 正好重复 n 次。 注意 n 为正整数&#xff08;0 < n < 100&a…...

JS中Array的forEach、map、filter方法区别?

一&#xff1a;基本用法 1、forEach()函数用于对数组中的每个元素执行给定的函数&#xff0c;而它不返回任何值&#xff0c;它只是对每个元素调用传入的函数。这个函数可以接受三个参数&#xff1a;当前元素的值、当前元素的索引和整个数组。 const arr [1, 2, 3]; arr.forE…...

Java的Arrays类的sort()方法(41)

目录 sort&#xff08;&#xff09;方法 1.sort&#xff08;&#xff09;方法的格式 2.使用sort&#xff08;&#xff09;方法时要导入的类 3.作用 4.作用的对象 5.注意 6.代码及结果 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;结果 sort&#xff08;&…...

Redis安装及其配置文件修改

一、redis 安装 点击即可下载 https://download.redis.io/releases/ 将下载后的包通过xftp上传到服务器 解压&#xff0c;我这边是解压到/usr/local目录下 -- 创建路径 mkdir /usr/local/redis -- 解压 tar -zxvf redis-4.0.0.tar.gz -C /usr/local/redis 为防止编译失败&am…...

VSOMEIP3抓包数据

环境 $ cat /etc/os-release NAME"Ubuntu" VERSION"20.04.6 LTS (Focal Fossa)" IDubuntu ID_LIKEdebian PRETTY_NAME"Ubuntu 20.04.6 LTS" VERSION_ID"20.04" HOME_URL"https://www.ubuntu.com/" SUPPORT_URL"https:/…...

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程] 0. 前言1. 资源信息获取函数——monitor.py2. UI界面——listen.py3. main.py4. 运行效果5. 编译 exe 程序6. 其他PyQt文章 0. 前言 利用 PyQt5 开发一个 windows 的资源监视助手&#xff0c;在使用虚…...

Linus Torvalds发布了第一个Linux内核6.4候选版本

导读自Linux内核6.3发布和下一个内核系列Linux 6.4的合并窗口开放以来&#xff0c;已经过去了一段时间&#xff0c;近日&#xff0c;Linus Torvalds发布了第一个RC&#xff08;候选发布版&#xff09;的里程碑&#xff0c;供公众测试。 为期两周的Linux内核6.4合并窗口现已关闭…...

由浅入深Dubbo核心源码剖析环境介绍

目录 1 框架介绍1.1 概述1.2 运行架构1.3 整体设计 2 环境搭建2.1 源码拉取2.2 源码结构2.3 环境导入2.4 测试2.5 管理控制台 1 框架介绍 1.1 概述 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架&#xff0c;使得应用可通过高性能的 RPC 实现服务的输出和输入功能&#…...

Java 远程连接 SQLite 数据库

Java 可以使用 JDBC API 来连接 SQLite 数据库。但是&#xff0c;SQLite 不支持远程连接&#xff0c;因为它是一种文件数据库&#xff0c;需要直接访问数据库文件。 如果您需要从远程位置访问 SQLite 数据库&#xff0c;可以将 SQLite 数据库文件放在共享文件夹中&#xff0c;…...

网安面试题大全(附答案)

本文面试题汇总&#xff1a; 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么&#xff1f;rip的工作原理 什么是RARP&#xff1f;工作原理 OSPF协议&#xff1f;OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手&#xff1f; tcp为什么要三次握手…...

windows 系统扩容C盘注意事项

windows系统大家都不陌生&#xff0c;是大家用的最多的操作系统。在实际的使用中&#xff0c;遇到需要扩容C盘的情况不是很多&#xff0c;但是如果遇到了&#xff0c;有以下几个事项需要大家注意&#xff1a; 剩余空间是否充足 不论当前服务器是物理服务器还是虚拟机&#xff…...

如何用Unpaywall浏览器扩展破解学术论文访问限制:技术实现与应用指南

如何用Unpaywall浏览器扩展破解学术论文访问限制&#xff1a;技术实现与应用指南 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpa…...

Playwright安装失败排障指南:五种生产级部署方式

1. 为什么“mcp-playwright”安装总卡在第一步&#xff1f;——先破除三个普遍误解你是不是也遇到过这样的情况&#xff1a;在终端里敲下pip install mcp-playwright&#xff0c;回车后等了三分钟&#xff0c;结果弹出一长串红色报错&#xff0c;最后一行赫然写着ERROR: No mat…...

为OpenClaw配置Taotoken作为OpenAI兼容供应商的完整流程

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw配置Taotoken作为OpenAI兼容供应商的完整流程 OpenClaw是一款流行的AI智能体开发工具&#xff0c;它允许开发者便捷地接…...

为 OpenClaw 配置 Taotoken 以实现稳定可靠的 Agent 工作流

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为 OpenClaw 配置 Taotoken 以实现稳定可靠的 Agent 工作流 对于使用 OpenClaw 框架构建智能体&#xff08;Agent&#xff09;的开…...

LogExpert实战指南:5大核心功能深度探索Windows日志分析高效方案

LogExpert实战指南&#xff1a;5大核心功能深度探索Windows日志分析高效方案 【免费下载链接】LogExpert Windows tail program and log file analyzer. 项目地址: https://gitcode.com/gh_mirrors/lo/LogExpert LogExpert是一款专为Windows平台设计的图形化日志分析工具…...

如何快速掌握XELFViewer:Linux二进制文件分析的终极指南

如何快速掌握XELFViewer&#xff1a;Linux二进制文件分析的终极指南 【免费下载链接】XELFViewer ELF file viewer/editor for Windows, Linux and MacOS. 项目地址: https://gitcode.com/gh_mirrors/xe/XELFViewer 你是否曾面对复杂的Linux可执行文件感到无从下手&…...

VSCode R扩展:如何在5分钟内搭建完整的R语言开发环境

VSCode R扩展&#xff1a;如何在5分钟内搭建完整的R语言开发环境 【免费下载链接】vscode-R R Extension for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-R 如果你正在寻找一个现代化的R语言开发工具&#xff0c;那么VSCode配合vscode-R扩…...

ab、Postman、JMeter并发测试真相:协议层、运行时与系统瓶颈解析

1. 为什么你测出来的“并发”根本不是并发——从一次线上服务雪崩说起上周五下午三点&#xff0c;我们一个核心订单查询接口突然响应时间从80ms飙升到2.3秒&#xff0c;错误率冲到17%&#xff0c;监控大盘一片血红。运维拉出负载曲线&#xff0c;CPU和内存都正常&#xff1b;开…...

Sketch MeaXure:5分钟掌握设计标注终极解决方案

Sketch MeaXure&#xff1a;5分钟掌握设计标注终极解决方案 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure 你是否还在为设计稿标注而烦恼&#xff1f;Sketch MeaXure正是为你量身打造的现代化设计标注神器&#xff01;…...

Thorium浏览器:基于Chromium的终极性能优化与隐私保护深度解析

Thorium浏览器&#xff1a;基于Chromium的终极性能优化与隐私保护深度解析 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towards the to…...