golang实现函数yamlToStruct(infile,outFile)
问:
golang实现函数yamlToStruct(infile,outFile),将yaml文件格式化成golang的结构体
gpt:
要实现一个将YAML文件格式化成Golang结构体的函数,你可以使用 `yaml` 和 `reflect` 包来处理。首先,你需要使用 `yaml.Unmarshal` 函数将YAML文件解析为一个 `map[string]interface{}` 类型的数据结构。然后,你可以使用递归函数来遍历这个map并生成相应的Golang结构体定义。
以下是一个简单的实现:
```go
package main
import (
"fmt"
"io/ioutil"
"log"
"reflect"
"gopkg.in/yaml.v2"
)
func yamlToStruct(infile, outFile string) error {
// 读取YAML文件内容
yamlData, err := ioutil.ReadFile(infile)
if err != nil {
return err
}
// 解析YAML文件
var data map[string]interface{}
if err := yaml.Unmarshal(yamlData, &data); err != nil {
return err
}
// 生成Golang结构体定义
structCode := generateStructCode("MyStruct", data)
// 将结构体定义写入文件
if err := ioutil.WriteFile(outFile, []byte(structCode), 0644); err != nil {
return err
}
return nil
}
func generateStructCode(structName string, data map[string]interface{}) string {
structCode := fmt.Sprintf("type %s struct {\n", structName)
for key, value := range data {
// 判断值的类型
switch v := value.(type) {
case map[interface{}]interface{}:
// 如果是嵌套map,则递归生成结构体定义
nestedStruct := generateStructCode(toCamelCase(key.(string)), v)
structCode += fmt.Sprintf("\t%s %s\n", toCamelCase(key.(string)), nestedStruct)
default:
// 其他类型直接生成字段定义
structCode += fmt.Sprintf("\t%s %s\n", toCamelCase(key.(string)), reflect.TypeOf(value).String())
}
}
structCode += "}\n"
return structCode
}
func toCamelCase(s string) string {
// 将下划线分隔的单词转换为驼峰式
result := ""
upper := true
for _, c := range s {
if c == '_' {
upper = true
} else {
if upper {
result += string(c - ('a' - 'A'))
upper = false
} else {
result += string(c)
}
}
}
return result
}
func main() {
// 替换为你的YAML文件路径和输出文件路径
infile := "example.yaml"
outFile := "output.go"
err := yamlToStruct(infile, outFile)
if err != nil {
log.Fatal(err)
}
}
```
在这个例子中,`yamlToStruct` 函数接受输入的YAML文件路径和输出的Golang文件路径。它首先读取YAML文件,然后使用 `yaml.Unmarshal` 函数将其解析为一个 `map[string]interface{}`。接着,它调用 `generateStructCode` 函数生成Golang结构体的定义,并将生成的代码写入到输出文件中。 `toCamelCase` 函数用于将下划线分隔的字段名转换为驼峰式。请注意,这个实现是一个简单的示例,可能需要根据实际情况进行调整。
调整后的代码:
package mainimport ("fmt""io/ioutil""log""reflect""gopkg.in/yaml.v2"
)func append(structName string) string {upName := toCamelCase(structName)data := fmt.Sprintf(`var g_%s *%sfunc Get%s() *%s {if g_%s != nil {return g_%s}yamlData, err := ioutil.ReadFile("assets/yaml/%s.yaml")if err != nil {return nil}g_%s = new(%s)if err := yaml.Unmarshal(yamlData, g_%s); err != nil {return nil}return g_%s
}`, upName, upName, upName, upName, upName, upName, structName, upName, upName, upName, upName)return data
}
func yamlToStruct(infile, outFile string, structName string) error {// 读取YAML文件内容yamlData, err := ioutil.ReadFile(infile)if err != nil {return err}// 解析YAML文件var data map[interface{}]interface{}if err := yaml.Unmarshal(yamlData, &data); err != nil {return err}// 生成Golang结构体定义structCode := generateStructCode(toCamelCase(structName), data, 1)// 将结构体定义写入文件if err := ioutil.WriteFile(outFile, []byte("package yaml\n"+structCode+append(structName)), 0644); err != nil {return err}return nil
}func generateStructCode(structName string, data map[interface{}]interface{}, deep int) string {structCode := fmt.Sprintf("%s struct {\n", structName)switch deep {case 1:structCode = fmt.Sprintf("type %s struct {\n", structName)case 2: //数组structCode = fmt.Sprintf("struct{\n")default:}for key, value := range data {// Check if key is a stringkeyStr, ok := key.(string)if !ok {// Handle the case where key is not a string (e.g., if YAML has non-string keys)log.Printf("Skipping key %v of non-string type\n", key)continue}// Determine the type of the valueswitch v := value.(type) {case []interface{}:// If it's an array, check if it's headersif len(v) > 0 {// Check if the first element is a mapif headerMap, ok := v[0].(map[interface{}]interface{}); ok {// If it's headers, generate struct code for Header typeheaderStruct := generateStructCode(toCamelCase(keyStr), headerMap, 2)structCode += fmt.Sprintf("\t%s []%s `yaml:\"%s\"`\n", toCamelCase(keyStr), headerStruct, keyStr)continue}if _, ok := v[0].(string); ok {// If it's headers, generate struct code for Header typestructCode += fmt.Sprintf("\t%s []%s `yaml:\"%s\"`\n", toCamelCase(keyStr), "string", keyStr)continue}}// If it's a regular array, generate struct code for its elementsnestedStruct := generateStructCode(toCamelCase(keyStr), v[0].(map[interface{}]interface{}), 2)structCode += fmt.Sprintf("\t%s []%s `yaml:\"%s\"`\n", toCamelCase(keyStr), nestedStruct, keyStr)case map[interface{}]interface{}:// If it's a nested map, recursively generate struct codenestedStruct := generateStructCode(toCamelCase(keyStr), v, 0)//structCode += fmt.Sprintf("\t%s %s `yaml:\"%s\"`\n", toCamelCase(keyStr), nestedStruct, keyStr)structCode += fmt.Sprintf("\t%s `yaml:\"%s\"`\n", nestedStruct, keyStr)default:// For other types, generate field definition with yaml tagstructCode += fmt.Sprintf("\t%s %s `yaml:\"%s\"`\n", toCamelCase(keyStr), reflect.TypeOf(value).String(), keyStr)}}structCode += "}"return structCode
}func toCamelCase(s string) string {// 将下划线分隔的单词转换为驼峰式result := ""upper := truefor _, c := range s {if c == '_' {upper = true} else {if upper {result += string(c - ('a' - 'A'))upper = false} else {result += string(c)}}}return result
}func main() {// 替换为你的YAML文件路径和输出文件路径var fileName stringfmt.Print("Path is assets/yaml and Enter the input YAML file name: ")fmt.Scanln(&fileName)infile := "assets/yaml/" + fileName + ".yaml"outFile := "assets/yaml/" + fileName + ".go"err := yamlToStruct(infile, outFile, fileName)if err != nil {log.Fatal(err)} else {log.Printf("make success")}
}
相关文章:
golang实现函数yamlToStruct(infile,outFile)
问: golang实现函数yamlToStruct(infile,outFile),将yaml文件格式化成golang的结构体 gpt: 要实现一个将YAML文件格式化成Golang结构体的函数,你可以使用 yaml 和 reflect 包来处理。首先,你需要使用 yaml.Unmarshal 函数将YAML文件解析为一…...
产品成本收集器流程演示
感谢大佬的文章,我只是一个翻译搬运工,原文地址:产品成本收集器 概述 SAP 令人兴奋的部分之一是它在不同操作模块之间的集成程度。使用产品成本收集器来跟踪生产就是一个很好的例子。在本博客中,我计划遵循产品成本收集器流程&a…...
【微服务】springboot整合quartz使用详解
目录 一、前言 二、quartz介绍 2.1 quartz概述 2.2 quartz优缺点 2.3 quartz核心概念 2.3.1 Scheduler 2.3.2 Trigger 2.3.3 Job 2.3.4 JobDetail 2.4 Quartz作业存储类型 2.5 适用场景 三、Cron表达式 3.1 Cron表达式语法 3.2 Cron表达式各元素说明 3.3 Cron表达…...
Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用时间处理工具
文章目录 1️⃣ 时间处理工具1.1 格式化时间1.2 把时间戳改成日期格式1.3 Day.js 工具类使用1.4 date-fns 工具类使用 优质资源分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134712978 ElectronTsVueVite桌面应用…...
记录 | centos源码编译bazel
tensorflow的源码编译依赖于 bazel 这里进行 bazel 的源码编译 1、安装依赖 sudo yum install -y java-11-openjdk sudo yum install -y java-11-openjdk-devel sudo yum install -y protobuf-compiler zip unzip2、知悉要安装的 bazel 的版本 务必安装受支持的 Bazel 版本…...
常见的Bean工厂后置处理器
此代码在jdk11上测试通过,SpringBoot版本为2.7.14 1.上代码 导入坐标 <dependencies><!-- spring数据坐标 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</art…...
代码随想录算法训练营第四十二天| 416 分割等和子集
目录 416 分割等和子集 416 分割等和子集 class Solution { public:const int N 210;bool canPartition(vector<int>& nums) {vector<int>f(N);int sum 0;for(auto num : nums)sum num;if(sum % 2 1)return false;//如果int target sum / 2;for(int i …...
memmove 和 memcpy的区别
函数原型及作用 memcpy 和 memmove 都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void* memcpy(void *dst, const void *src, size_t count); void* memmove(void *dst, const void *…...
C实现的双向链表队列
如下代码所示,一个头文件实现的双向链表,用c代码实现: #ifndef _LINUX_LIST_H #define _LINUX_LIST_H#include "stddef.h" #include "poison.h"#ifndef ARCH_HAS_PREFETCH #define ARCH_HAS_PREFETCH static inline voi…...
自适应中值滤波器的python代码实现-----冈萨雷斯数字图像处理
基本原理: 自适应中值滤波器是一种图像处理技术,用于去除图像中的噪声。其原理是根据像素周围邻域内像素值的特性,动态地选择滤波器的大小和中值滤波的程度。 **邻域选择:**对于每个像素点,选取一个窗口或者邻域&…...
Python作业答疑_6.22~6.25
一、Python 一班 1. 基数分割列表 1.1 问题描述 给定一无序数列,把数列的第一个数字当成基数,让数列中基数小的数字排在数列前面,比基数大的数字排在数列的后面。 1.2 问题示例 如数列:num[4,1,8,3,9,2,10,7]。基数为 4&…...
Uber Go 语言编码规范
uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…...
UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大内核ConvNet
摘要 https://arxiv.org/abs/2311.15599 大核卷积神经网络(ConvNets)最近受到了广泛的研究关注,但存在两个未解决的关键问题需要进一步研究。(1)现有大核ConvNets的架构在很大程度上遵循传统ConvNets或Transformers的设计原则,而大核ConvNets的架构设计仍未得到充分解决。(2…...
Http协议与Tomcat
HTTP协议 HTTP协议(HyperText Transfer Protocol)即超文本传输协议 ,是TCP/IC网络体系结构应用层的一个客户端-服务端协议,是所有客户端,服务端数据传输的基石(数据传输规则) 特点 ⭐基于TCP协…...
Spring AOP从入门到精通
目录 1. AOP的演化过程 1. 代理模式 2. 动态代理 2.1 JDK动态代理 2.2 Cglib动态代理 3. Spring模式 3.1 ProxyFactory 3.2 ProxyFactoryBean 3.3 AbstractAutoProxyCreator 2. Spring AOP抽象 1. 核心术语 1.1 连接点(JoinPoint) 1.2 切点(Pointcut) 1.3 增强(Ad…...
Tap虚拟网卡
1 概述 Tap设备通常用于虚拟化场景下,其驱动代码位于drivers/net/tun.c,tap与tun复用大部分代码, 注:drivers/net/tap.c并不是tap设备的代码,而是macvtap和ipvtap; 下文中,我们统一称tap&#…...
【数电笔记】53-与非门构成的基本RS触发器
目录 说明: 1. 电路组成 2. 逻辑功能 3. 特性表 4. 特性方程 5. 状态转换图 6. 驱动表 7. 例题 例1 例2 说明: 笔记配套视频来源:B站;本系列笔记并未记录所有章节,只对个人认为重要章节做了笔记;…...
kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录
kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录 1. k8s环境 k8s使用kubernetes-server-linux-amd64_1.19.10.tar.gz 二进制bin 的方式手动部署 k8s 版本: [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:&…...
Hadoop入门学习笔记
视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 这里写目录标题 一、VMware准备Linux虚拟机1.1. VMware安装Linux虚拟机1.1.1. 修改虚拟机子网IP和网关1.1.2. 安装…...
堆栈,BSS,DATA,TEXT
一、目标文件 首先目标文件的构成,Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件(Object File)。 目标文件和可执行文件一般采用同一种格式,这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
