gutil.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. // Package gutil provides utility functions.
  7. package gutil
  8. import (
  9. "reflect"
  10. "github.com/gogf/gf/v2/internal/empty"
  11. "github.com/gogf/gf/v2/util/gconv"
  12. )
  13. const (
  14. dumpIndent = ` `
  15. )
  16. // IsEmpty checks given `value` empty or not.
  17. // It returns false if `value` is: integer(0), bool(false), slice/map(len=0), nil;
  18. // or else returns true.
  19. func IsEmpty(value interface{}) bool {
  20. return empty.IsEmpty(value)
  21. }
  22. // Keys retrieves and returns the keys from given map or struct.
  23. func Keys(mapOrStruct interface{}) (keysOrAttrs []string) {
  24. keysOrAttrs = make([]string, 0)
  25. if m, ok := mapOrStruct.(map[string]interface{}); ok {
  26. for k := range m {
  27. keysOrAttrs = append(keysOrAttrs, k)
  28. }
  29. return
  30. }
  31. var (
  32. reflectValue reflect.Value
  33. reflectKind reflect.Kind
  34. )
  35. if v, ok := mapOrStruct.(reflect.Value); ok {
  36. reflectValue = v
  37. } else {
  38. reflectValue = reflect.ValueOf(mapOrStruct)
  39. }
  40. reflectKind = reflectValue.Kind()
  41. for reflectKind == reflect.Ptr {
  42. if !reflectValue.IsValid() || reflectValue.IsNil() {
  43. reflectValue = reflect.New(reflectValue.Type().Elem()).Elem()
  44. reflectKind = reflectValue.Kind()
  45. } else {
  46. reflectValue = reflectValue.Elem()
  47. reflectKind = reflectValue.Kind()
  48. }
  49. }
  50. switch reflectKind {
  51. case reflect.Map:
  52. for _, k := range reflectValue.MapKeys() {
  53. keysOrAttrs = append(keysOrAttrs, gconv.String(k.Interface()))
  54. }
  55. case reflect.Struct:
  56. var (
  57. fieldType reflect.StructField
  58. reflectType = reflectValue.Type()
  59. )
  60. for i := 0; i < reflectValue.NumField(); i++ {
  61. fieldType = reflectType.Field(i)
  62. if fieldType.Anonymous {
  63. keysOrAttrs = append(keysOrAttrs, Keys(reflectValue.Field(i))...)
  64. } else {
  65. keysOrAttrs = append(keysOrAttrs, fieldType.Name)
  66. }
  67. }
  68. }
  69. return
  70. }
  71. // Values retrieves and returns the values from given map or struct.
  72. func Values(mapOrStruct interface{}) (values []interface{}) {
  73. values = make([]interface{}, 0)
  74. if m, ok := mapOrStruct.(map[string]interface{}); ok {
  75. for _, v := range m {
  76. values = append(values, v)
  77. }
  78. return
  79. }
  80. var (
  81. reflectValue reflect.Value
  82. reflectKind reflect.Kind
  83. )
  84. if v, ok := mapOrStruct.(reflect.Value); ok {
  85. reflectValue = v
  86. } else {
  87. reflectValue = reflect.ValueOf(mapOrStruct)
  88. }
  89. reflectKind = reflectValue.Kind()
  90. for reflectKind == reflect.Ptr {
  91. reflectValue = reflectValue.Elem()
  92. reflectKind = reflectValue.Kind()
  93. }
  94. switch reflectKind {
  95. case reflect.Map:
  96. for _, k := range reflectValue.MapKeys() {
  97. values = append(values, reflectValue.MapIndex(k).Interface())
  98. }
  99. case reflect.Struct:
  100. var (
  101. fieldType reflect.StructField
  102. reflectType = reflectValue.Type()
  103. )
  104. for i := 0; i < reflectValue.NumField(); i++ {
  105. fieldType = reflectType.Field(i)
  106. if fieldType.Anonymous {
  107. values = append(values, Values(reflectValue.Field(i))...)
  108. } else {
  109. values = append(values, reflectValue.Field(i).Interface())
  110. }
  111. }
  112. }
  113. return
  114. }