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