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

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

go 复制代码
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)
}
相关推荐
何以解忧,唯有..4 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
踏着七彩祥云的小丑4 天前
Go学习第9天:并发编程 + 文件操作 + 正则表达式
学习·golang·正则表达式·go
JCGKS4 天前
Go `init` 函数:包初始化顺序到底是怎样的
golang·init·init执行顺序
何以解忧,唯有..4 天前
Go语言中的const:常量声明与iota枚举详解
java·开发语言·golang
geovindu4 天前
go: Reactor Pattern
开发语言·后端·设计模式·golang·反应器模式
記億揺晃着的那天4 天前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
jingling5555 天前
go | 环境安装和快速入门
开发语言·后端·golang
java_cj5 天前
从kubectl学Visitor模式:如何优雅处理多态数据结构的遍历
云原生·golang·k8s·访问者模式
何以解忧,唯有..5 天前
Go语言类型转换详解:从基础到进阶实践
开发语言·后端·golang
何以解忧,唯有..5 天前
Go 语言指针类型详解:从基础到实战
开发语言·后端·golang