package components

import "fmt"
import "reflect"

//复制结构体中名称一致类型一致得字段
func CopyFields(des interface{}, src interface{}, fields ...string) (err error) {
at := reflect.TypeOf(des)
av := reflect.ValueOf(des)
bt := reflect.TypeOf(src)
bv := reflect.ValueOf(src)

// 简单判断下
if at.Kind() != reflect.Ptr {
err = fmt.Errorf("des must be a struct pointer")
return
}
av = reflect.ValueOf(av.Interface())

// 要复制哪些字段
_fields := make([]string, 0)
if len(fields) > 0 {
_fields = fields
} else {
for i := 0; i < bv.NumField(); i++ { _fields = append(_fields, bt.Field(i).Name) } } if len(_fields) == 0 { return } // 复制 for i := 0; i < len(_fields); i++ { name := _fields[i] f := av.Elem().FieldByName(name) bValue := bv.FieldByName(name) // a中有同名的字段并且类型一致才复制 if f.IsValid() && f.Kind() == bValue.Kind() && f.CanSet() { f.Set(bValue) } } return }

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注