【Go】通过反射解析对象tag信息,实现简易ORM

news2024/9/23 15:28:16

反射是运行时,需要在运行时解析类型信息,编译期无法优化这些操作,因此比编译时已知类型信息的直接调用效率要低。

package main

import (
	"fmt"
	"reflect"
	"strings"
)

type Person struct {
	Name string `json:"name" gorm:"column:name"`
	Age  int    `json:"age" gorm:"column:age"`
}

func Parse(p interface{}) {
	tp := reflect.TypeOf(p)
	tv := reflect.ValueOf(p)

	if tp.Kind() == reflect.Pointer {
		tp = tp.Elem()
		tv = tv.Elem()
	}

	for i := 0; i < tp.NumField(); i++ {
		field := tp.Field(i)
		name := field.Name
		value := tv.FieldByName(name).Interface()

		var column string
		tag := field.Tag.Get("gorm")
		parts := strings.Split(tag, ":")
		if len(parts) == 2 {
			column = parts[1]
		}

		fmt.Printf("变量名:%s 值:%v 数据库字段名:%s\n", name, value, column)
	}
}

func main() {
	p0 := &Person{
		Name: "Jackie",
		Age:  20,
	}
	Parse(p0)

	p1 := Person{
		Name: "Avalanche",
		Age:  30,
	}
	Parse(p1)
}

在这里插入图片描述

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

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

相关文章

T9打卡学习笔记

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_growth(gpus[0], True) #设置…

慢SQL优化的30个思路方案整理

文章目录 &#xff08;1&#xff09;索引优化&#xff08;2&#xff09;查询重构&#xff08;3&#xff09;减少数据扫描量&#xff08;4&#xff09;利用缓存&#xff08;5&#xff09;分区表&#xff08;6&#xff09;优化排序和分组&#xff08;7&#xff09;业务查询条件限…

力扣面试150 基本计算器 双栈模拟

Problem: 224. 基本计算器 &#x1f468;‍&#x1f3eb; 参考题解 Code class Solution {public int calculate(String s) {// 存放所有的数字&#xff0c;用于计算LinkedList<Integer> nums new LinkedList<>();// 为了防止第一个数为负数&#xff0c;先往 nu…

创建stm32f103c8t6基本工程

创建stm32f103c8t6基本工程 (1)桌面空白处,鼠标右键新建文件夹,重命名为工程名字 (2)打开keil5 (3)点击Project-> New uvision project (4)找到我们桌面的刚才新建的文件夹,文件名 , 起自己的工程名字的,不要用空格 , 然后点击保存 (5)选择如下芯片, 然后确定 (6)然后就会弹…

linux的ceph

ceph ceph是一个开源的&#xff0c;用c语言编写的分布式的存储系统。存储文件数据。 分布式由多台物理磁盘组成一个集群&#xff0c;在这个基础之上实现高可用&#xff0c;扩展。 ceph是一个统一的存储系统&#xff0c;同时提供块设备存储&#xff0c;文件系统存储和对象存储…

C++学习笔记05-补充知识点(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文对读者可以用作自查&#xff0c;答案在后面&#xff0…

55 华三模拟器Server2 操作

华三模拟器Server2 操作 # /etc/config/dhcp uci set dhcp.eth2dhcp uci set dhcp.eth2.interfaceeth2 uci set dhcp.eth2.start100 uci set dhcp.eth2.limit150 uci set dhcp.eth2.leasetime12h # /etc/config/network uci set network.eth2interface uci set network.eth2.pr…

可爱萌《奥咕和秘密森林》,电脑单机游戏免费分享

《奥咕和秘密森林》是一款2D冒险游戏&#xff0c;游戏中玩家将与奥咕宝宝一起探索一个奇妙的世界。这款游戏的特点包括手绘角色和多种谜题&#xff0c;玩家可以在游戏中与激萌的小动物成为朋友&#xff0c;打败异界怪物&#xff0c;揭开未知世界的秘密。 游戏特色 探索世界&am…

宁德时代社招SHL入职测评:语言理解数字推理测评及综合测评真题、高分攻略、答题技巧

宁德时代的社招入职测评主要采用SHL的Verify系统&#xff0c;测评内容包括语言理解、数字推理、逻辑推理等部分。具体来说&#xff0c;语言理解部分包括阅读理解、逻辑填空和语句排序等题型&#xff0c;要求在限定时间内完成一定数量的题目 。数字推理部分则包括数字序列、数学…

JavaScript 数组排序

JavaScript 提供了多种对数组进行排序的方法&#xff0c;其中最常见和直接的是使用数组的 .sort() 方法。.sort() 方法可以对数组的元素进行排序&#xff0c;并返回排序后的数组。然而&#xff0c;.sort() 方法默认将数组元素转换为字符串&#xff0c;并按照字符串的 Unicode 编…

【Python】数据类型之字典(上)

字典是有序、键不重复且元素只能是键值对的可变的一个容器。 data{"k1":1,"k2":25} data中“k1”和“k2”是键&#xff0c;而1,25是值。“k1”:1,"k2":25是键值对。 1&#xff09;&#xff09;容器&#xff1a;存储多个元素。 2&#xff09;…

2024年港澳台联考高校新一波录取分数线来啦

导读 在前面几次中&#xff0c;我们和大家分享了一些2024年港澳台联考高校最新的录取分数线。今天我们继续来看一批新的录取分数线吧&#xff01;景于行分享的数据基本上都是经过可靠验证的&#xff0c;大家可以放心参考。 上海大学 上海大学和深圳大学是近些年来&#xff0c;依…

haproxy的安装和服务信息

为什么要使用haproxy&#xff1f; 因为LSV无后端检测&#xff0c;当webserver有一台状态异常&#xff0c;则运作异常&#xff1b;所以用haproxy来解决。 haproxy是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器&#xff0c;它支持基于cookie的持久性&#xff0c;自动…

力扣-1两数之和2两数相加-2024/8/3

1、两数之和 解法一 暴力法&#xff08;2个for循环&#xff09; class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for ii in range(len(nums)):for jj in range(ii1, len(nums)):if nums[ii]nums[jj] target:return [ii,jj]解法二 哈希表法…

具有并发功能的网页以及一点链表相关内容

最近学习内容&#xff0c;前几天做了个小项目&#xff0c;通过tcp与html构建具有并发功能的商城 具有以下功能&#xff1a; 1 登陆进入查询页面 2 搜索商品信息概述 3 查看商品详细信息 4 记录访客信息 5 注册新用户 主页如下 主页程序 程序的设计&#xff1a;将现实中大…

DELL EMC PowerStore1000T存储添加主机、映射LUN

本次操作是为了把存储的卷映射给VMware集群&#xff0c;存储网络协议为FC SAN&#xff0c;存储端和主机端均连接FC交换机&#xff0c;并且FC交换机已完成ZONE相关配置 具体操作过程如下&#xff1a; 一、DELL EMC PowerStore1000T添加主机 1、进入Web控制台&#xff0c;点击…

字符函数和字符串函数(C语言)

目录 一. 字符分类函数 二. 字符转换函数 三.多种函数的使用和模拟实现 3.1 strlen函数 3.2 strcpy函数 3.3 strcat函数 3.4 strcmp函数 3.5 strncpy strncat strncmp &#x1f35f;&#x1f9e3;结束了指针的学习&#xff0c;我们开始了字符串之旅&#xf…

【若依项目-RuoYi】掌握若依前端的基本流程

搞毕设项目&#xff0c;使用前后端分离技术&#xff0c;后端springBoot&#xff0c;前端vue3element plus。自己已经写好前端与后端代码&#xff0c;但想换一个前端界面所以使用到了若依&#xff0c;前前后后遇到许多坑&#xff0c;记录一下&#xff0c;方便之后能够快速回忆。…

创意指南丨VR游览沉浸式空间体验

欢迎来到我们制作的VR幻想世界。玩家的起点是一条蓝色水晶大道&#xff0c;让我们一起探索这个如梦似幻的境地。 在这条大道的两侧&#xff0c;漂浮着半透明的大水晶水母。它们轻盈地在空中飘动&#xff0c;仿佛在欢迎我们的到来。这条道路上方&#xff0c;一个个半圆环不停地…

人脸身份证比对接口如何用Java对接?(二)

一、什么是人脸身份证比对&#xff1f; 人脸身份证比对又称人证比对&#xff0c;实人比对&#xff0c;人像比对&#xff0c;输入姓名、身份证号码和头像照片&#xff0c;与公安库身份证头像进行权威比对&#xff0c;返回分值作为判断依据。 二、人脸身份证比对接口适用哪些场…