返回顶部
首页 > 资讯 > 后端开发 > GO >golang:解组动态 YAML 注释
  • 655
分享到

golang:解组动态 YAML 注释

go语言 2024-02-09 10:02:13 655人浏览 八月长安
摘要

PHP小编百草为你带来了一篇关于golang的文章,标题是“解组动态 YAML 注释”。这篇文章将详细介绍如何在Golang中解析包含注释的YAML文件,并将注释信息与对应的数据关联起

PHP小编百草为你带来了一篇关于golang的文章,标题是“解组动态 YAML 注释”。这篇文章将详细介绍如何在Golang中解析包含注释的YAML文件,并将注释信息与对应的数据关联起来。通过本文,你将了解到如何使用Go语言的yaml.v3包来实现这一功能,并能够在自己的项目中灵活应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的知识和技巧。让我们一起开始吧!

问题内容

我想动态更改 struct 的注释并使用 yaml.unmarshal ,如下所示:

package main

import (
    "fmt"
    "reflect"

    "gopkg.in/yaml.v3"
)

type User struct {
    Name string `yaml:"dummy"`
}

func (u *User) UnmarshalYAML(node *yaml.Node) error {
    value := reflect.ValueOf(*u)
    t := value.Type()
    fields := make([]reflect.StructField, 0)

    for i := 0; i < t.NumField(); i++ {
        fields = append(fields, t.Field(i))

        if t.Field(i).Name == "Name" {
            fields[i].Tag = `yaml:"name"` // Dynamic annotation
        }
    }

    newType := reflect.StructOf(fields)
    newValue := value.Convert(newType)

    err := node.Decode(newValue.Interface()) // Cause error because it's not pointer
    return err
}

var dat string = `name: abc`

func main() {
    out := User{}
    yaml.Unmarshal([]byte(dat), &out)
    fmt.Printf("%+v\n", out)
}

它会导致像 panic:reflect:reflect.value.set using unaddressable value [recovered] 这样的错误,我认为这是因为 node.decode 不与指针一起使用。那么如何创建新类型的指针呢?

解决方法

这是有效的更新演示:

package main

import (
    "fmt"
    "reflect"
    "unsafe"

    "gopkg.in/yaml.v3"
)

type User struct {
    Name string `yaml:"dummy"`
}

func (u *User) UnmarshalYAML(node *yaml.Node) error {
    t := reflect.TypeOf(*u)
    fields := make([]reflect.StructField, 0)

    for i := 0; i < t.NumField(); i++ {
        fields = append(fields, t.Field(i))

        if t.Field(i).Name == "Name" {
            fields[i].Tag = `yaml:"name"` // Dynamic annotation
        }
    }

    newType := reflect.StructOf(fields)
    newValue := reflect.NewAt(newType, unsafe.Pointer(u)).Elem()

    err := node.Decode(newValue.Addr().Interface())
    return err
}

var dat string = `name: abc`

func main() {
    out := User{}
    yaml.Unmarshal([]byte(dat), &out)
    fmt.Printf("%+v\n", out)
}

两个关键变化:

  1. newvalue.interface() 替换为 newvalue.addr().interface()。 (参见此示例:https://www.php.cn/link/e96c7de8f6390b1e6c71556e4e0a4959 a>)

  2. newvalue := value.convert(newtype) 替换为 newvalue := reflect.newat(newtype, unsafe.pointer(u)).elem()

    我们这样做是因为 value :=reflect.valueof(*u) 中的 value 是不可寻址的(您可以使用 fmt.printf("%v", value.addr()) 进行验证。它会出现错误并显示消息 panic : 不可寻址值的reflect.value.addr()。

以上就是golang:解组动态 YAML 注释的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: golang:解组动态 YAML 注释

本文链接: https://lsjlt.com/news/562421.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golang:解组动态 YAML 注释
    php小编百草为你带来了一篇关于Golang的文章,标题是“解组动态 YAML 注释”。这篇文章将详细介绍如何在Golang中解析包含注释的YAML文件,并将注释信息与对应的数据关联起...
    99+
    2024-02-09
    go语言
  • 详解Golang的注释使用
    Golang注释的使用方法详解,需要具体代码示例 导言:在软件开发过程中,注释是一项非常重要的技术工具。良好的注释能够提高代码的可读性和可维护性,方便他人理解和修改代码。本文主要讨论Golang中注释的使用方...
    99+
    2024-01-29
    详解 使用方法 Golang注释
  • 一文详解golang中的注释
    Golang是一种编程语言,它有着比较高的代码可读性和简洁性。然而,在编写代码时,总有些地方需要添加注释来帮助解释某些细节或者增加代码的可读性。在这篇文章中,我们将介绍一些关于Golang注释的内容。一、单行注释单行注释是在代码行的末尾添加...
    99+
    2023-05-14
    go语言 Golang 注释
  • golang中的两种注释(语法详解)
    在 Go 语言中,注释分为两种类型:单行注释和多行注释。单行注释单行注释是以 // 开头的注释。例如:// 这是一个单行注释在单行注释后面,直到该行行末,所有内容都会被视为注释。多行注释多行注释以 结束,中间的内容都会被视为注释。例如:多...
    99+
    2023-05-14
  • 静态语言和动态语言,解释和编译
    前提 通过高级语言编写的源码,我们能够轻松理解,但对于计算机来说,它只认识二进制指令,源码就是天书,根本无法识别。源码要想执行,必须先转换成二进制指令。 所谓二进制指令,也就是由 0 和 1 组成的机...
    99+
    2023-09-05
    ruby php 开发语言
  • 详解Angular动态组件
    目录使用场景怎么实现一、动态组件放在哪二、怎么获取组件的实例使用场景 我们先明确下动态组件的使用场景,在代码运行时要动态加载组件,换成普通人话,代码需要根据具体情况(比如用户的操作,...
    99+
    2024-04-02
  • vue.js 动态组件详解
    :is 动态组件 使用 v-bind:is=”组件名”,会自动去找匹配的组件名,如果没有,则不显示; <div id="app"> <test v-bi...
    99+
    2024-04-02
  • 怎么使用gomment自动为Golang代码添加注释
    这篇“怎么使用gomment自动为Golang代码添加注释”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用gommen...
    99+
    2023-07-05
  • vue3动态加载组件以及动态引入组件详解
    目录1.问题2.分析3.最后总结1.问题 在做一个用vite构建的vue3项目时,动态拉取导入.vue页面,然后控制台一直有以下提示,页面也无法渲染出来。 2.分析 根据上面的报错...
    99+
    2023-03-23
    vue 动态加载组件 vue加载组件 vue3动态加载组件
  • Golang 动态脚本调研详解
    目录一、技术背景1.1 程序的动态链接技术1.1.1 动态链接库1.1.2 动态共享对象1.1.3 非编译语言的动态技术1.2 Golang 的动态技术二、Golang 的第三方解释...
    99+
    2024-04-02
  • Mybatis如何实现@Select等注解动态组合SQL语句
    目录一、背景说明二、实现方案三、 实现自定义注解1、自定义Select注解2、自定义Select in注解3、自定义Update的注解4、自定义Insert的注解 同理四、...
    99+
    2024-04-02
  • 关于Android的静态注册和动态注册以及跨平台的静态和动态注册的理解
    Android的静态注册和动态注册以及跨平台的静态和动态注册的理解 何为Android广播: Android广播就是一个全局大喇叭,就是告知,就...
    99+
    2022-06-06
    静态 跨平台 动态 Android
  • vue components 动态组件详解
    目录总结总结数组发生变化时,动态加载相应数据 场景:点击不同组件名称,界面显示相应组件 步骤一:导入所需组件 步骤二:点击 tab 选项卡,将对应组件名添加进数组 步骤三:使用动态组...
    99+
    2024-04-02
  • 常见的Golang注释错误及其解决方法
    Golang中常见注释错误及解决方法 引言:在编程过程中,注释是非常重要的一部分,它可以提供对代码逻辑的解释、功能的说明以及协作开发时的沟通等作用。然而,即使是注释这样简单的东西,也可能会出现一些错误。本文将...
    99+
    2024-01-29
  • BroadcastReceiver动态注册案例详解
    BroadcastReceiver动态注册案例演示,供大家参考,具体内容如下 此案例共介绍2种动态注册广播接收器,为自定义广播接收器和系统广播接收器。当点击发送按钮后,将会弹出收到自...
    99+
    2024-04-02
  • IDEA2020.3.2版本自动注释类和方法注释模板配置步骤详解
    想来大家在学习或者开发的环境下经常要自己注解类和方法吧;下面我来为大家讲解怎么创建自己的注解模板: 一.配置类自动注解 1.打开idea file–>Settings–>...
    99+
    2024-04-02
  • PHP+MySQL制作简单动态网站(附详细注释+源码)
    项目介绍 项目名称:图书管理系统 项目实现的内容: 用户登录、用户注册、登录界面验证码功能。 退出登录功能、内容查看、内容添加、内容修改。 前端页面设计得有点可能不太专业,将就着用。主要专注在功能的实现。  内容页 添加内容 删除内容 ...
    99+
    2023-09-06
    mysql php
  • 重要性和误区:详解Golang中注释的作用
    Golang注释:注释的重要性及常见误区解析 在日常的软件开发中,注释作为一种重要的文档形式,起着记录、解释、说明代码的作用。对于Golang这样一门简洁明了的语言来说,注释同样扮演着...
    99+
    2024-02-25
  • C语言动态数组详解
    目录内存分配函数malloc calloc realloc free内存操作函数 memset memcpy memmove二维动态数组的建立和释放总结内存分配函数malloc ca...
    99+
    2024-04-02
  • vue3动态组件使用详解
    目录vue2vue3markRow:标记一个对象,使其不能成为一个响应式对象。toRaw:将响应式对象(由 reactive定义的响应式)转换为普通对象。shallowRef:只处理...
    99+
    2023-02-27
    vue3中动态组件 vue3动态加载组件 vue3动态添加组件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作