go两个结构体赋值相同类型和名称的字段(测试)

package main

import (
	"fmt"
	"reflect"
	"time"
)

type TA struct {
	Id   *int32       `json:"id"`
	TT   TT           `json:"tt"`
	Arr  Array[int32] `json:"arr"`
	Date Datetime     `json:"date"`
}

type TB struct {
	Id   *int32       `json:"id"`
	TT   TT           `json:"tt"`
	Arr  Array[int32] `json:"arr"`
	Date Datetime     `json:"date"`
}

type Array[T string | int32 | int8] []T
type Datetime time.Time

type TT struct {
	Id int32 `json:"id"`
}

func main() {
	var num int32 = 1
	a := TA{
		Id: &num,
		TT: TT{
			Id: 2,
		},
		Arr:  []int32{1, 2},
		Date: Datetime(time.Now()),
	}
	var b TB
	StructAssign(&b, &a)
	fmt.Printf("%#v\n", a)
	fmt.Printf("%#v\n", b)
}

func StructAssign(binding interface{}, value interface{}) {
	bVal := reflect.ValueOf(binding).Elem() // 获取reflect.Type类型
	vVal := reflect.ValueOf(value).Elem()   // 获取reflect.Type类型
	vTypeOfT := vVal.Type()
	for i := 0; i < vVal.NumField(); i++ {
		// 相同属性的字段,有则修改其值
		name := vTypeOfT.Field(i).Name
		// 同类型
		valType := vTypeOfT.Field(i).Type

		if ok := bVal.FieldByName(name).IsValid() && bVal.FieldByName(name).Type() == valType; ok {
			bVal.FieldByName(name).Set(reflect.ValueOf(vVal.Field(i).Interface()))
		}
	}
}
posted @   burndust  阅读(519)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示