golang 获取循环嵌套结构的tag

Golang高效处理Parquet文件:从列式存储原理到生产实践 列式存储是一种面向数据分析的数据库存储技术,其核心原理是将数据按列而非按行组织。与传统的行式存储(如CSV)相比,列式存储能显著提升查询性能,因为它允许查询引擎仅读取查询所需的特定列数据,从而大幅减少I/O开销。这种技术通过高效的编码和压缩算法,如字典编码和Snappy压缩,进一步减小了存储体积。其技术价值在于为大规模数据分析、即席查询和数据仓库场景提供了高性能、高压缩比的解决方案。在数据工程领域,列式存储格式已成为处理海量日志分析、数据交换和归档的事实标准。本文聚焦于如何在Golang生态中应用Parqu 阅读详情

golang 获取

type Parent struct {
	Age  int    `json:"age"`
	City string `json:"city" cond:"title:城市"`
	Name string `json:"name" cond:"title:name1"`
}

type Son struct {
	Parent
	Name string `json:"name" cond:"title:名字"`
}

需要对Son{} 进行获取循环嵌套的cond的结构的数据结果。

  • 没有 cond 的忽略
  • 继承的依旧优先级低

方法实现

package main

import (
	"errors"
	"fmt"
	"reflect"
)

func GetAllTags(rt reflect.Type, key string) (tags map[string]reflect.StructField, err error) {
	tags = make(map[string]reflect.StructField)
	if rt.Kind() != reflect.Struct {
		err = errors.New(fmt.Sprintf("bad type not struct %s", rt.Kind()))
		return
	}

	for i := 0; i < rt.NumField(); i++ {
		f := rt.Field(i)

		// 嵌套型
		if f.Type.Kind() == reflect.Struct {
			var newTags map[string]reflect.StructField
			newTags, err = GetAllTags(f.Type, key)
			if err != nil {
				return
			}

			for k, v := range newTags {
				tags[k] = v
			}
		}

		tag := f.Tag.Get(key)
		if tag == "" {
			continue
		}
		jsonName := f.Tag.Get("json")
		if jsonName == "" {
			err = errors.New(fmt.Sprintf("error %s missing tag JSON", f.Name))
			return
		}
		tags[jsonName] = f
	}

	return
}

type Parent struct {
	Age  int    `json:"age"`
	City string `json:"city" cond:"title:城市"`
	Name string `json:"name" cond:"title:name1"`
}

type Son struct {
	Parent
	Name string `json:"name" cond:"title:名字"`
}

func main() {
	var (
		err  error
		key  = "cond"
		alls map[string]reflect.StructField
	)
	{
		alls, err = GetAllTags(reflect.TypeOf(Son{}), key)
		if err != nil {
			fmt.Println("err1 = ", err.Error())
		} else {
			fmt.Println("alls = ", alls)
		}
	}
}

// outputs:
// alls =  map[city:{City  string json:"city" cond:"title:城市" 8 [1] false} name:{Name  string json:"name" cond:"title:名字" 40 [1] false}]

Golang反射实战:如何用结构体标签实现JSON自动解析(附避坑指南) 本文深入探讨了Golang反射机制在JSON自动解析中的应用,详细解析了结构体标签的使用原理和实战技巧。通过反射基础、JSON序列化/反序列化实现细节、生产环境常见问题解决方案以及高级性能优化策略,帮助开发者高效处理JSON数据,特别适合需要处理高并发JSON解析的Golang开发者。 阅读详情

相关推荐

Go struct tags本质:编译期元数据契约与JSON序列化原理

struct tags是Go语言中用于结构体字段元数据声明的核心机制,它并非运行时装饰器,而是在编译期固化到类型信息中的静态契约。其设计遵循显式性、零分配和协议解耦原则,底层通过runtime._type.uncommonType字段存储,由reflect.StructTag安全访问。技术价值体现在序列化控制(如json:"name"、omitempty、string)、多协议共存(json/yaml/xml)及自定义配置驱动等工程场景。在API开发、微服务配置热加载和金融级数据序列化中,正确理解tag解析

weixin_34184561的博客 389

golang获取结构体中的tag_GoLang知识点

1. 系统中断信号注册interrupt := make(chan os.Signal) // 可以控制强制终止的信号 // 如果系统有中断信号,发送给r.interrupt signal.Notify(interrupt, os.Interrupt) // Ctrl+C 退出 sig := make(chan os.Signal, 1) signal.Notify(sig, syscall....

weixin_39543773的博客 1146

golang学习笔记(基础篇)

Golang学习笔记_从零开始

lcynone的博客 1118

c语言 typeof 结构体,Go语言通过反射获取结构体的成员类型

任意值通过 reflect.TypeOf() 获得反射对象信息后,如果它的类型是结构体,可以通过反射值对象(reflect.Type)的 NumField() 和 Field() 方法获得结构体成员的详细信息。与成员获取相关的 reflect.Type 的方法如下表所示。结构体成员访问的方法列表方法说明Field(i int) StructField根据索引,返回索引对应的结构体字段的信息。当值不...

weixin_29111593的博客 757

新买的USB无线网卡插上没反应?保姆级排查指南:从设备管理器到网络列表

本文提供USB无线网卡无法识别的全流程排查手册,涵盖硬件检测、驱动管理和网络配置三大维度。重点解析设备管理器中的设备状态诊断和驱动解决方案,特别适用于Realtek芯片的无线网卡(如RTL8188GU、RTL8812BU等),帮助用户快速解决网卡插上无反应的问题。

weixin_29876033的博客 497

拆解特斯拉Optimus的关节技术:谐波减速器在仿人机器人中的5个精妙设计

本文深度解析特斯拉Optimus仿人机器人关节中的谐波减速器技术,揭示其五大工程突破:微型化材料革命、两万分之一圈精度实现、碳纤维柔轮轻量化、智能运维系统及国产替代方案。重点探讨谐波减速器如何通过创新设计和先进材料实现精准传动,为仿人机器人提供高效可靠的关节动力解决方案。

omega的博客 1072

Golang匿名结构体&结构体嵌套(实战使用)

Golang匿名结构体&结构体嵌套(实战使用)

sunriseYJP的博客 1776

UE4游戏逆向实战:从HOOK明文包到自定义发包的完整流程(附加密算法解析)

本文详细解析了UE4游戏网络通信的逆向工程完整流程。从定位线程发包点、HOOK拦截明文封包,到逆向分析加密解密算法,最终实现自定义组包与加密发送。文章结合实战案例,为游戏安全研究和技术人员提供了一套清晰、可操作的方法论。

weixin_29009081的博客 1234

Golang 嵌套结构体

type SetTime struct { CreateTime int64 `json:"create_time"` UpdateTime int64 `json:"update_time"` } func (s *SetTime) Set(v int64) { s.CreateTime = v s.UpdateTime = v } type Out struct { Name string SetTime } 要想访问嵌套结构体的字段以及方法,需要以这种形式 var out Out o

票呀 2341

【电机学复习笔记】同步电机的特性及参数的求取

同步电机的主要特性包括:空载特性、短路特性、零功率因数负载特性、外特性和调整特性。 基于以上特性我们可以实现: 从空载特性和短路特性求同步电抗的不饱和值和短路比; 从零功率因数负载特性和空载特性确定保梯电抗(定子漏抗)和电枢反应电动势

Pantrick_的博客 2万+

百度慧眼人口位置数据:从原理到实战的GIS处理全流程

本文详细解析百度慧眼人口位置数据的处理全流程,从基本原理到实战应用。通过空间网格划分、终端数量统计等技术手段,百度慧眼数据能准确反映人群分布特征。文章涵盖坐标系转换、核密度分析、热力图制作等GIS处理技巧,并分享商业选址、城市规划等典型业务场景的解决方案,帮助读者高效利用这一数据资源。

weixin_30872157的博客 531

golang tag标签取值

【代码】golang tag标签取值。

yzh_1346983557的博客 410

Spring Boot Jar包加密实战:用ClassFinal与Jasypt打造代码安全堡垒

Spring Boot代码加密与配置保护方案 针对Spring Boot项目源码和配置易被反编译的风险,本文提出ClassFinal字节码加密+Jasypt配置加密的组合方案。ClassFinal通过Maven插件对核心代码加密,运行时需JavaAgent加载,反编译后仅保留空方法体;Jasypt则采用强加密算法保护敏感配置。方案优势包括: 双重保护:ClassFinal加密业务逻辑,Jasypt加密数据库密码等配置 灵活部署:支持密码启动、机器绑定等安全策略 平滑集成:兼容Spring生态,动态解密结合配

墨夶的博客 1092

GO反射

GO反射 Go语言反射获取 反射介绍 反射可以在运行时动态获取变量的相关信息。Go语言中reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值。 反射获取常用函数和方法: func TypeOf(i interface{}) Type

鱼的博客 292

一篇文章带你快速入门 MATLAB

文章目录一、认识 MATLAB 界面二、MATLAB 的运行方式三、Matlab 中的窗口1. 命令窗口2. MATLAB的程序编辑窗口3. 工作空间窗口4. 命令历史窗口5. 图形窗口6. 当前目录窗口四、MATLAB的帮助系统1. 帮助命令2. 联机帮助五、其他知识补充1. MATLAB的搜索路径2. 变量命名规则3. M文件命名规则 一、认识 MATLAB 界面 在 MATLAB Desktop 中,工具条取代了菜单和工具栏。应用程序库收纳了 MATLAB 产品系列的应用程序,单一文件应用程序打包为一

南淮北安的博客 5125

《用 AI 赋能医药科研创新》目录(持续更新)

本专栏旨在指导医学科研和药物研发人员运用AI技术提升研究效率。内容包括:利用AI分析文献、识别研究热点、自动生成研究草稿;在新药研发中,通过AI优化临床方案设计、受试者筛选等环节;介绍AI理论基础如大语言模型、提示词工程学及智能体技术发展历程。专栏采用5000-9000字的长文形式,系统讲解AI在医药研发各环节的应用方法,帮助研究者缩短周期、降低成本,推动医药研发进入智能化新阶段。

MD Code 498

Go语言JSON标准库(encoding/json):功能解析与实战指南

定义,实现该接口后,Marshal会调用自定义方法序列化对象。定义,实现该接口后,Unmarshal会调用自定义方法反序列化数据。示例代码:自定义时间格式转换import ("fmt""time"// Order 包含时间字段的订单结构体CreateTime time.Time `json:"create_time"` // 自定义时间格式// MarshalJSON 实现json.Marshaler接口,自定义序列化逻辑// 自定义时间格式:YYYY-MM-DD HH:MM:SS。

qq_40230623的博客 774

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Golang基础入门

本篇教程适用于对Golang感兴趣的初学者,也适用于对Golang基础知识点不太熟练的初学者,也适用于对于Golang基础知识点查缺补漏的初学者,此文档知识内容丰富,收录了较为详细的Golang常用知识点,通过本篇文档,希望对大家Golang的基础学习有所帮助(如果有重要的知识点,博主未列出,请在下方评论处指出,谢谢!)

m0_73094011的博客 2669

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

入门Go语言,这一篇就Go了(10w+字小结)

Go 语言入门教程

菜籽爱编程 1707

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

llvm-gcc-compat补齐cc 编译命令实现鸿蒙PC安装第三方库go-playground/validator,玩转go语言常用于 HTTP 接口入参校验、表单校验、数据库实体字段校验

欢迎加入开源鸿蒙PC社区:欢迎在PC社区平台申请新建项目本文讲解鸿蒙PC基于musl库、应用沙箱与二进制强制签名机制,不原生支持Go语言,通用Linux编译产物无法直接运行。需借助社区Harmonybrew包管理器搭建开发环境:纯Go开发安装go与ohos-sdk,依托SDK实现编译自动签名;CGO跨语言开发需额外安装llvm-gcc-compat补齐cc 编译命令,编译时手动开启CGO参数。搭配CodeArts IDE可完成全流程开发,同时需提前处理软件冲突、使用原生终端规避环境报错。可以参考。

2401_86113894的博客 295

Go语言理论一

Go语言理论一

wgchen 634

go基础第一遍学习(李文周博客)

go基础第一遍学习记录,内容来自李文周博客的第一遍学习,输出增强记忆和便于回顾

qq_52395816的博客 8043

Golang基础学习笔记(一)

文章目录1.Golang的数据类型1.1 Golang中精度丢失问题1.2 byte 和 rune类型1.3 修改字符串1.4 基本数据类型转换2.Golang的流程控制2.1 for range(键值循环)2.2 switch case2.3 goto:跳转到指定标签3.Golang的数组3.1 数组定义和初始化3.2 数组的值类型3.3 切片定义(引用类型)4.Golang的切片4.1 为什么要使用切片4.2 基于数组定义切片4.3 切片的长度和容量4.4 切片的本质4.5 使用make函数构造切片4.

Korbin的博客 922

go语言入门基础详谈(语法篇)

文章目录GO语言学习笔记(重要记录)GO基础相关学习:1.Go语言基础之变量常量1.Go语言的变量声明格式为:2.Go语言的常量声明格式为:2.Go语言基础之基本数据类型1.1整型1.2.浮点型1.3复数1.4布尔值1.5字符串1.6字符串的常用操作1.7byte和rune类型1.8修改字符串1.9类型转换3.Go语言基础之流程控制一.if else(分支语句)二.for(循环结构)1.for循环2.忽略for循环的初始语句3.省略初始语句和结束语句4无限循环5.for range(键值循环)三.switc

weixin_51261234的博客 3955

llvm-gcc-compat补齐cc 编译命令实现鸿蒙PC安装第三方库copier,玩转go语言结构体自动复制映射库

欢迎加入开源鸿蒙PC社区:欢迎在PC社区平台申请新建项目本文讲解鸿蒙PC基于musl库、应用沙箱与二进制强制签名机制,不原生支持Go语言,通用Linux编译产物无法直接运行。需借助社区Harmonybrew包管理器搭建开发环境:纯Go开发安装go与ohos-sdk,依托SDK实现编译自动签名;CGO跨语言开发需额外安装llvm-gcc-compat补齐cc 编译命令,编译时手动开启CGO参数。搭配CodeArts IDE可完成全流程开发,同时需提前处理软件冲突、使用原生终端规避环境报错。可以参考。

2401_86113894的博客 288

Go语言JSON处理核心指南:从encoding/json原理到TVBox配置实战

JSON作为Web数据交换的通用格式,其序列化与反序列化能力是后端开发的基础能力。Go语言通过标准库encoding/json提供原生支持,依托结构体标签(struct tag)、零值语义和编译期字段映射机制,实现类型安全、错误明确、性能可控的JSON处理。它不依赖反射运行时匹配,而是通过导出字段+json tag建立内存视图与文本格式间的确定性映射,天然适配API契约、配置文件生成与微服务通信等场景。本文结合tvbox配置福利json接口自己做的、听书源链接合集json等真实需求,详解json.Marsh

weixin_33836874的博客 480
上一篇: python3 英文字母单数转复数
下一篇: golang gorm查询任意字段的组装方法
用户昵称不能为空
博客等级 码龄18年 735粉丝 631原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值