StructUtil.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package utils
  2. import (
  3. "fmt"
  4. "reflect"
  5. "ulink-admin/frame"
  6. )
  7. func CopyFields(a interface{}, b interface{}, fields ...string) (err error) {
  8. at := reflect.TypeOf(a)
  9. av := reflect.ValueOf(a)
  10. bt := reflect.TypeOf(b)
  11. bv := reflect.ValueOf(b)
  12. // 简单判断下
  13. if at.Kind() != reflect.Ptr {
  14. frame.Throw(frame.BUSINESS_CODE, "请传入指针类型")
  15. return
  16. }
  17. if bt.Kind() == reflect.Ptr { //处理指针
  18. bt = bt.Elem()
  19. bv = bv.Elem()
  20. }
  21. av = reflect.ValueOf(av.Interface())
  22. // 要复制哪些字段
  23. _fields := make([]string, 0)
  24. if len(fields) > 0 {
  25. _fields = fields
  26. } else {
  27. for i := 0; i < bv.NumField(); i++ {
  28. _fields = append(_fields, bt.Field(i).Name)
  29. }
  30. }
  31. if len(_fields) == 0 {
  32. fmt.Println("no fields to copy")
  33. return
  34. }
  35. // 复制
  36. for i := 0; i < len(_fields); i++ {
  37. name := _fields[i]
  38. f := av.Elem().FieldByName(name)
  39. bValue := bv.FieldByName(name)
  40. // a中有同名的字段并且类型一致才复制
  41. if f.IsValid() && f.Kind() == bValue.Kind() {
  42. f.Set(bValue)
  43. } else {
  44. fmt.Printf("no such field or different kind, fieldName: %s\n", name)
  45. }
  46. }
  47. return
  48. }
  49. func GetFieldS(bean interface{}) []string {
  50. fields := make([]string, 0)
  51. beanType := reflect.TypeOf(bean)
  52. beanValue := reflect.ValueOf(bean)
  53. if beanType.Kind() == reflect.Ptr { //处理指针
  54. beanType = beanType.Elem()
  55. beanValue = beanValue.Elem()
  56. }
  57. if beanType.Kind() != reflect.Struct { //如果不是struct类型,直接返回
  58. return fields
  59. }
  60. for i := 0; i < beanType.NumField(); i++ {
  61. field := beanType.Field(i) //通过这个i作为它的索引,从0开始来取得它的字段
  62. value := beanValue.Field(i)
  63. if value.IsValid() {
  64. fields = append(fields, Camel2Case(field.Name))
  65. }
  66. }
  67. return fields
  68. }