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")}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维03:LAMP

黄金架构LAMP 什么是LAMP LAMP是公认的最常见,最古老的黄金web技术栈 快速部署LAMP架构 #停止nginx,并且把nginx应用卸载了 systemctl stop nginx yum remove nginx -y#关闭防火墙 iptables -F #清空防火墙规则,比如哪些请求允许进入服…

06 数仓平台MaxWell

Maxwell简介 Maxwell是由Zendesk公司开源,用 Java 编写的MySQL变更数据抓取软件,能实时监控 MySQL数据库的CRUD操作将变更数据以 json 格式发送给 Kafka等平台。 Maxwell输出数据格式 Maxwell 原理 Maxwell工作原理是实时读取MySQL数据库的二进制日志…

angular新版本未生成app.module.ts

https://angular.cn/tutorial/tour-of-heroes https://angular.cn/tutorial/tour-of-heroes/toh-pt0 ng new angular-tour-of-heroes cd angular-tour-of-heroes ng serve --open 查看目录,未生成app.module.ts 网上搜了一下 https://github.com/angular/angul…

【算法】蓝桥杯2013国C 横向打印二叉树 题解

文章目录 题目链接题目描述输入格式输出格式样例自己的样例输入自己的样例输出 思路整体思路存储二叉搜索树中序遍历并存储计算目标数的行号dfs遍历并写入数组初始化和处理输入输出初始化处理输入处理输出 完整的代码如下 结束语更新初始化的修改存储二叉搜索树的修改中序遍历和…

C语言实现梁友栋-Barsky算法

前言: (引用梁友栋-Barsky裁剪算法_梁友栋 barsky算法-CSDN博客) Cyrus和Beck用参数化方法提出了比Cohen-Sutherland更有效的算法。后来梁友栋和Barsky独立地提出了更快的参数化线段裁剪算法,也称为Liany-Barsky(LB&…

oops-framework框架 之 音频管理(六)

引擎: CocosCreator 3.8.0 环境: Mac Gitee: oops-game-kit 注: 作者dgflash的oops-framework框架QQ群: 628575875 简介 在CocosCreator中,音频的播放主要通过组件: AudioSource 来管理音乐、音效的播放、暂停和停止…

【尚硅谷】第07章:随堂复习与企业真题(面向对象-进阶)

来源:尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备) 基本都是宋老师发的资料里面的内容,只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第07章:随堂复习…

k8s的部署管理以及prometheus相关监控

安装运行prometheus和grafana编辑prometheus配置文件,增加采集prometheus自身数据的采集规则grafana上导入prometheus相关图表的dashboard 前面三步主要根据https://blog.csdn.net/shnu_cdk/article/details/132182858?spm1001.2014.3001.5506 用Go编写一个prome…

C# 热键注册工具类

写在前面 介绍一个验证过的热键注册工具类,使用系统类库user32.dll中的RegisterHotkey函数来实现全局热键的注册。 代码实现 [Flags]public enum KeyModifiers{Alt 1,Control 2,Shift 4,Windows 8,NoRepeat 0x4000}public static class HotKeyHelper{[DllImp…

01、pytest:帮助你编写更好的程序

简介 ​pytest框架可以很容易地编写小型、可读的测试,并且可以扩展以支持应用程序和库的复杂功能测试。使用pytest至少需要安装Python3.7或PyPy3。PyPI包名称为pytest 一个快速的例子 content of test_sample.py def inc(x):return x1def test_ansewer():assert i…

OpenCV-Python:图像卷积操作

目录 1.图像卷积定义 2.图像卷积实现步骤 3.卷积函数 4.卷积知识考点 5.代码操作及演示 1.图像卷积定义 图像卷积是图像处理中的一种常用操作,主要用于图像的平滑、锐化、边缘检测等任务。它可以通过滑动一个卷积核(也称为滤波器)在图像…

MySQL之时间戳(DateTime和TimeStamp)

MySQL之时间戳(DateTime和TimeStamp) 文章目录: MySQL之时间戳(DateTime和TimeStamp)一、DateTime类型二、TimeStamp类型三、DateTime和TimeStamp的区别 当插入数据时,需要自动记录一个时间时候&#xff0c…

MT4下载常见问题解答:解决安装过程中的技术难题

MetaTrader 4(简称MT4)是全球广泛使用的外汇交易平台,它以强大的功能、用户友好的界面和高度定制性获得了众多金融交易者的青睐。然而,对于初次接触MT4的用户来说,下载和安装MT4软件可能会遇到一些技术难题。本文作为一位资深金融技术专家的分…

人工智能_机器学习059_非线性核函数_poly核函数_rbf核函数_以及linear核函数效果对比---人工智能工作笔记0099

人工智能_机器学习059_非线性核函数介绍---人工智能工作笔记0099 那么我们应该如何调整这个SVC的参数,也就是我们应该使用哪种核函数,比较合适呢?这取决于我们的数据,适合使用哪个核函数,正好我们有 提供的score = accuracy_score(y_test,y_pred) 这样的评分函数,我们可以根据…

ffmpeg 实现多视频轨录制到同一个文件

引言 在视频录制中,有时会碰到这样一个需求,将不同摄像头的画面写入到一个视频文件,这个叫法很多,有的厂家叫合流模式,有的叫多画面多流模式。无论如何,它们的实质都是在一个视频文件上实现多路不同分辨率视…

记录66666

为了在两台运行RHEL 8的服务器上配置PostgreSQL 14的主从架构,你需要按照以下步骤操作。这里,假设你有两台服务器,主服务器的IP为192.168.1.100,从服务器的IP为192.168.1.101。我们将设置数据目录为/data/,归档日志目录…

保护你的数据:深入了解安全测试!

安全测试是一种非功能性测试。与功能测试不同,功能测试关注的是软件的功能是否正常工作(软件做什么),非功能测试关注的是应用程序是否被正确设计和配置。 安全测试的主要目标: 识别资产-需要保护的东西,如…

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础 一、项目介绍 1.1方案提供 1.2主控选择 1.3硬件平台 1.4 开发环境 1.5 关于华清 二、GUI界面基础 2.1.1 嵌入式绘图系统 2.1.1 色彩格式 2.1.1帧缓冲区 …

力扣374周赛

力扣第374场周赛 找出峰值 模拟 class Solution { public:vector<int> findPeaks(vector<int>& mountain) {vector<int>ans;for(int i 1 ; i < mountain.size() - 1; i ){if(mountain[i] > mountain[i-1] && mountain[i] > mountai…

CleanMyMac X2024最新免费Mac中文版安装包下载

CleanMyMac X for Mac中文2024版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。cleanmymac x个人认为X代表界面上的最大升级&#xff0c;功能方面有更多增加&#xff0c;与最新macOS系统更加兼容&#xff0c;流畅地与系统性…