Go语言中的反射应用:合并两个结构体的字段

2023-12-24#Go

在使用 Go 语言编写程序时,少不了使用反射机制优化代码,甚至于减少代码。本文介绍一种简单的合并结构体字段的方法。

mergo 工具实现了两个结构体的合并,但是它支持相同类型结构体的合并。以下的 Merge 函数可合并不同类型的结构体,需要注意函数的实参必须是指向结构体的指针。这个 Merge 只对结构体上的字段进行简单合并,并不会递归地进行合并。

package main

import (
	"fmt"
	"reflect"
)

type Request struct {
	Name    string
	Ignored string
}

type User struct {
	ID   uint
	Name string
	Age  uint
}

func Merge(dest interface{}, src interface{}) {
	srcVal := reflect.ValueOf(src).Elem()

	destVal := reflect.ValueOf(dest).Elem()

	for i := 0; i < srcVal.NumField(); i++ {
		srcField := srcVal.Type().Field(0)
		srcValue := srcVal.Field(0)

		destValue := destVal.FieldByName(srcField.Name)

		if destValue.IsValid() {
			destValue.Set(srcValue)
		}
	}
}

func main() {
	user := User{ID: 1, Name: "Jack", Age: 1}
	req := Request{Name: "Jim", Ignored: "ignored"}

	Merge(&user, &req) // 注意此处必须传入指针

	fmt.Println(user) // {1 Jim 1}
}

合并结构体的场景比较多,如果想要一个通用的工具,其实比较复杂。实际中,可以基于反射的基本原理,实现特性条件下的合并函数。


加载中...