package utils import ( "fmt" "reflect" "ulink-admin/frame" ) func CopyFields(a interface{}, b interface{}, fields ...string) (err error) { at := reflect.TypeOf(a) av := reflect.ValueOf(a) bt := reflect.TypeOf(b) bv := reflect.ValueOf(b) // 简单判断下 if at.Kind() != reflect.Ptr { frame.Throw(frame.BUSINESS_CODE, "请传入指针类型") return } if bt.Kind() == reflect.Ptr { //处理指针 bt = bt.Elem() bv = bv.Elem() } 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 { fmt.Println("no fields to copy") 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.Set(bValue) } else { fmt.Printf("no such field or different kind, fieldName: %s\n", name) } } return } func GetFieldS(bean interface{}) []string { fields := make([]string, 0) beanType := reflect.TypeOf(bean) beanValue := reflect.ValueOf(bean) if beanType.Kind() == reflect.Ptr { //处理指针 beanType = beanType.Elem() beanValue = beanValue.Elem() } if beanType.Kind() != reflect.Struct { //如果不是struct类型,直接返回 return fields } for i := 0; i < beanType.NumField(); i++ { field := beanType.Field(i) //通过这个i作为它的索引,从0开始来取得它的字段 value := beanValue.Field(i) if value.IsValid() { fields = append(fields, Camel2Case(field.Name)) } } return fields }