gconv_slice_float.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. // SliceFloat is alias of Floats.
  9. func SliceFloat(i interface{}) []float64 {
  10. return Floats(i)
  11. }
  12. // SliceFloat32 is alias of Float32s.
  13. func SliceFloat32(i interface{}) []float32 {
  14. return Float32s(i)
  15. }
  16. // SliceFloat64 is alias of Float64s.
  17. func SliceFloat64(i interface{}) []float64 {
  18. return Floats(i)
  19. }
  20. // Floats converts <i> to []float64.
  21. func Floats(i interface{}) []float64 {
  22. return Float64s(i)
  23. }
  24. // Float32s converts <i> to []float32.
  25. func Float32s(i interface{}) []float32 {
  26. if i == nil {
  27. return nil
  28. }
  29. var array []float32
  30. switch value := i.(type) {
  31. case string:
  32. if value == "" {
  33. return []float32{}
  34. }
  35. return []float32{Float32(value)}
  36. case []string:
  37. array = make([]float32, len(value))
  38. for k, v := range value {
  39. array[k] = Float32(v)
  40. }
  41. case []int:
  42. array = make([]float32, len(value))
  43. for k, v := range value {
  44. array[k] = Float32(v)
  45. }
  46. case []int8:
  47. array = make([]float32, len(value))
  48. for k, v := range value {
  49. array[k] = Float32(v)
  50. }
  51. case []int16:
  52. array = make([]float32, len(value))
  53. for k, v := range value {
  54. array[k] = Float32(v)
  55. }
  56. case []int32:
  57. array = make([]float32, len(value))
  58. for k, v := range value {
  59. array[k] = Float32(v)
  60. }
  61. case []int64:
  62. array = make([]float32, len(value))
  63. for k, v := range value {
  64. array[k] = Float32(v)
  65. }
  66. case []uint:
  67. for _, v := range value {
  68. array = append(array, Float32(v))
  69. }
  70. case []uint8:
  71. array = make([]float32, len(value))
  72. for k, v := range value {
  73. array[k] = Float32(v)
  74. }
  75. case []uint16:
  76. array = make([]float32, len(value))
  77. for k, v := range value {
  78. array[k] = Float32(v)
  79. }
  80. case []uint32:
  81. array = make([]float32, len(value))
  82. for k, v := range value {
  83. array[k] = Float32(v)
  84. }
  85. case []uint64:
  86. array = make([]float32, len(value))
  87. for k, v := range value {
  88. array[k] = Float32(v)
  89. }
  90. case []bool:
  91. array = make([]float32, len(value))
  92. for k, v := range value {
  93. array[k] = Float32(v)
  94. }
  95. case []float32:
  96. array = value
  97. case []float64:
  98. array = make([]float32, len(value))
  99. for k, v := range value {
  100. array[k] = Float32(v)
  101. }
  102. case []interface{}:
  103. array = make([]float32, len(value))
  104. for k, v := range value {
  105. array[k] = Float32(v)
  106. }
  107. default:
  108. if v, ok := i.(apiFloats); ok {
  109. return Float32s(v.Floats())
  110. }
  111. if v, ok := i.(apiInterfaces); ok {
  112. return Float32s(v.Interfaces())
  113. }
  114. // Use reflect feature at last.
  115. rv := reflect.ValueOf(i)
  116. switch rv.Kind() {
  117. case reflect.Slice, reflect.Array:
  118. length := rv.Len()
  119. array = make([]float32, length)
  120. for n := 0; n < length; n++ {
  121. array[n] = Float32(rv.Index(n).Interface())
  122. }
  123. default:
  124. return []float32{Float32(i)}
  125. }
  126. }
  127. return array
  128. }
  129. // Float64s converts <i> to []float64.
  130. func Float64s(i interface{}) []float64 {
  131. if i == nil {
  132. return nil
  133. }
  134. var array []float64
  135. switch value := i.(type) {
  136. case string:
  137. if value == "" {
  138. return []float64{}
  139. }
  140. return []float64{Float64(value)}
  141. case []string:
  142. array = make([]float64, len(value))
  143. for k, v := range value {
  144. array[k] = Float64(v)
  145. }
  146. case []int:
  147. array = make([]float64, len(value))
  148. for k, v := range value {
  149. array[k] = Float64(v)
  150. }
  151. case []int8:
  152. array = make([]float64, len(value))
  153. for k, v := range value {
  154. array[k] = Float64(v)
  155. }
  156. case []int16:
  157. array = make([]float64, len(value))
  158. for k, v := range value {
  159. array[k] = Float64(v)
  160. }
  161. case []int32:
  162. array = make([]float64, len(value))
  163. for k, v := range value {
  164. array[k] = Float64(v)
  165. }
  166. case []int64:
  167. array = make([]float64, len(value))
  168. for k, v := range value {
  169. array[k] = Float64(v)
  170. }
  171. case []uint:
  172. for _, v := range value {
  173. array = append(array, Float64(v))
  174. }
  175. case []uint8:
  176. array = make([]float64, len(value))
  177. for k, v := range value {
  178. array[k] = Float64(v)
  179. }
  180. case []uint16:
  181. array = make([]float64, len(value))
  182. for k, v := range value {
  183. array[k] = Float64(v)
  184. }
  185. case []uint32:
  186. array = make([]float64, len(value))
  187. for k, v := range value {
  188. array[k] = Float64(v)
  189. }
  190. case []uint64:
  191. array = make([]float64, len(value))
  192. for k, v := range value {
  193. array[k] = Float64(v)
  194. }
  195. case []bool:
  196. array = make([]float64, len(value))
  197. for k, v := range value {
  198. array[k] = Float64(v)
  199. }
  200. case []float32:
  201. array = make([]float64, len(value))
  202. for k, v := range value {
  203. array[k] = Float64(v)
  204. }
  205. case []float64:
  206. array = value
  207. case []interface{}:
  208. array = make([]float64, len(value))
  209. for k, v := range value {
  210. array[k] = Float64(v)
  211. }
  212. default:
  213. if v, ok := i.(apiFloats); ok {
  214. return v.Floats()
  215. }
  216. if v, ok := i.(apiInterfaces); ok {
  217. return Floats(v.Interfaces())
  218. }
  219. // Use reflect feature at last.
  220. rv := reflect.ValueOf(i)
  221. switch rv.Kind() {
  222. case reflect.Slice, reflect.Array:
  223. length := rv.Len()
  224. array = make([]float64, length)
  225. for n := 0; n < length; n++ {
  226. array[n] = Float64(rv.Index(n).Interface())
  227. }
  228. default:
  229. return []float64{Float64(i)}
  230. }
  231. }
  232. return array
  233. }