Golang通过反射对结构体进行赋值和其他操作

通过反射可以方便快捷地访问Golang的结构体字段,并进行赋值或其他操作。

当两个结构体内容相同但名字不同时,如何快捷地进行赋值?

【或者内容有交集,对交集部分进行赋值】

package main

import (
	"fmt"
	"reflect"
)

type My_struct struct {
	Name  string
	Age   int
	House string
}

type Another_struct struct {
	House  string
	Age    int
	HaveDog bool
	Name   string
}

func main() {

	a := &My_struct{}
	b := &Another_struct{ "beijing", 20,true,"james"}

	c := reflect.TypeOf(*a)  //获取type
	d := reflect.TypeOf(*b)

	g := reflect.ValueOf(a).Elem() //获取value
	h := reflect.ValueOf(b).Elem()
	//双循环,对相同名字对字段进行赋值
	for i := 0; i < c.NumField(); i++ {
		for j:=0;j<d.NumField();j++ {
			if c.Field(i).Name == d.Field(j).Name {
				g.Field(i).Set(h.Field(j))
			}
		}
	}
	fmt.Println(*a,*b)
	//{james 20 beijing} {beijing 20 true james}
}

通过typeof和valueof操作结构体的方式,可以方便快捷地便利结构体的字段,从而更优雅地操作结构体字段。包括一些比较和赋值等操作,如果结构体中有指针类型,则对指针类型特殊处,其他的仍在循环中遍历即可