1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- 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
- }
|