gconv_slice_str.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 gconv
  7. import "reflect"
  8. // SliceStr is alias of Strings.
  9. func SliceStr(any interface{}) []string {
  10. return Strings(any)
  11. }
  12. // Strings converts `any` to []string.
  13. func Strings(any interface{}) []string {
  14. if any == nil {
  15. return nil
  16. }
  17. var array []string
  18. switch value := any.(type) {
  19. case []int:
  20. array = make([]string, len(value))
  21. for k, v := range value {
  22. array[k] = String(v)
  23. }
  24. case []int8:
  25. array = make([]string, len(value))
  26. for k, v := range value {
  27. array[k] = String(v)
  28. }
  29. case []int16:
  30. array = make([]string, len(value))
  31. for k, v := range value {
  32. array[k] = String(v)
  33. }
  34. case []int32:
  35. array = make([]string, len(value))
  36. for k, v := range value {
  37. array[k] = String(v)
  38. }
  39. case []int64:
  40. array = make([]string, len(value))
  41. for k, v := range value {
  42. array[k] = String(v)
  43. }
  44. case []uint:
  45. array = make([]string, len(value))
  46. for k, v := range value {
  47. array[k] = String(v)
  48. }
  49. case []uint8:
  50. array = make([]string, len(value))
  51. for k, v := range value {
  52. array[k] = String(v)
  53. }
  54. case []uint16:
  55. array = make([]string, len(value))
  56. for k, v := range value {
  57. array[k] = String(v)
  58. }
  59. case []uint32:
  60. array = make([]string, len(value))
  61. for k, v := range value {
  62. array[k] = String(v)
  63. }
  64. case []uint64:
  65. array = make([]string, len(value))
  66. for k, v := range value {
  67. array[k] = String(v)
  68. }
  69. case []bool:
  70. array = make([]string, len(value))
  71. for k, v := range value {
  72. array[k] = String(v)
  73. }
  74. case []float32:
  75. array = make([]string, len(value))
  76. for k, v := range value {
  77. array[k] = String(v)
  78. }
  79. case []float64:
  80. array = make([]string, len(value))
  81. for k, v := range value {
  82. array[k] = String(v)
  83. }
  84. case []interface{}:
  85. array = make([]string, len(value))
  86. for k, v := range value {
  87. array[k] = String(v)
  88. }
  89. case []string:
  90. array = value
  91. case [][]byte:
  92. array = make([]string, len(value))
  93. for k, v := range value {
  94. array[k] = String(v)
  95. }
  96. default:
  97. if v, ok := any.(apiStrings); ok {
  98. return v.Strings()
  99. }
  100. if v, ok := any.(apiInterfaces); ok {
  101. return Strings(v.Interfaces())
  102. }
  103. // Not a common type, it then uses reflection for conversion.
  104. var reflectValue reflect.Value
  105. if v, ok := value.(reflect.Value); ok {
  106. reflectValue = v
  107. } else {
  108. reflectValue = reflect.ValueOf(value)
  109. }
  110. reflectKind := reflectValue.Kind()
  111. for reflectKind == reflect.Ptr {
  112. reflectValue = reflectValue.Elem()
  113. reflectKind = reflectValue.Kind()
  114. }
  115. switch reflectKind {
  116. case reflect.Slice, reflect.Array:
  117. var (
  118. length = reflectValue.Len()
  119. slice = make([]string, length)
  120. )
  121. for i := 0; i < length; i++ {
  122. slice[i] = String(reflectValue.Index(i).Interface())
  123. }
  124. return slice
  125. default:
  126. return []string{String(any)}
  127. }
  128. }
  129. return array
  130. }