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}
}
合并结构体的场景比较多,如果想要一个通用的工具,其实比较复杂。实际中,可以基于反射的基本原理,实现特性条件下的合并函数。
加载中...