gconv_slice_str.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright 2019 gf Author(https://github.com/gogf/gf). 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(i interface{}) []string {
  10. return Strings(i)
  11. }
  12. // Strings converts <i> to []string.
  13. func Strings(i interface{}) []string {
  14. if i == nil {
  15. return nil
  16. }
  17. var array []string
  18. switch value := i.(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 := i.(apiStrings); ok {
  98. return v.Strings()
  99. }
  100. if v, ok := i.(apiInterfaces); ok {
  101. return Strings(v.Interfaces())
  102. }
  103. // Use reflect feature at last.
  104. rv := reflect.ValueOf(i)
  105. switch rv.Kind() {
  106. case reflect.Slice, reflect.Array:
  107. length := rv.Len()
  108. array = make([]string, length)
  109. for n := 0; n < length; n++ {
  110. array[n] = String(rv.Index(n).Interface())
  111. }
  112. default:
  113. return []string{String(i)}
  114. }
  115. }
  116. return array
  117. }