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…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
