Go语言中的反射应用:合并两个结构体的字段
· 约 1 分钟阅读
在使用 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}}合并结构体的场景比较多,如果想要一个通用的工具,其实比较复杂。实际中,可以基于反射的基本原理,实现特性条件下的合并函数。