gconv_slice_uint.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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. // SliceUint is alias of Uints.
  9. func SliceUint(any interface{}) []uint {
  10. return Uints(any)
  11. }
  12. // SliceUint32 is alias of Uint32s.
  13. func SliceUint32(any interface{}) []uint32 {
  14. return Uint32s(any)
  15. }
  16. // SliceUint64 is alias of Uint64s.
  17. func SliceUint64(any interface{}) []uint64 {
  18. return Uint64s(any)
  19. }
  20. // Uints converts `any` to []uint.
  21. func Uints(any interface{}) []uint {
  22. if any == nil {
  23. return nil
  24. }
  25. var array []uint
  26. switch value := any.(type) {
  27. case string:
  28. if value == "" {
  29. return []uint{}
  30. }
  31. return []uint{Uint(value)}
  32. case []string:
  33. array = make([]uint, len(value))
  34. for k, v := range value {
  35. array[k] = Uint(v)
  36. }
  37. case []int8:
  38. array = make([]uint, len(value))
  39. for k, v := range value {
  40. array[k] = uint(v)
  41. }
  42. case []int16:
  43. array = make([]uint, len(value))
  44. for k, v := range value {
  45. array[k] = uint(v)
  46. }
  47. case []int32:
  48. array = make([]uint, len(value))
  49. for k, v := range value {
  50. array[k] = uint(v)
  51. }
  52. case []int64:
  53. array = make([]uint, len(value))
  54. for k, v := range value {
  55. array[k] = uint(v)
  56. }
  57. case []uint:
  58. array = value
  59. case []uint8:
  60. array = make([]uint, len(value))
  61. for k, v := range value {
  62. array[k] = uint(v)
  63. }
  64. case []uint16:
  65. array = make([]uint, len(value))
  66. for k, v := range value {
  67. array[k] = uint(v)
  68. }
  69. case []uint32:
  70. array = make([]uint, len(value))
  71. for k, v := range value {
  72. array[k] = uint(v)
  73. }
  74. case []uint64:
  75. array = make([]uint, len(value))
  76. for k, v := range value {
  77. array[k] = uint(v)
  78. }
  79. case []bool:
  80. array = make([]uint, len(value))
  81. for k, v := range value {
  82. if v {
  83. array[k] = 1
  84. } else {
  85. array[k] = 0
  86. }
  87. }
  88. case []float32:
  89. array = make([]uint, len(value))
  90. for k, v := range value {
  91. array[k] = Uint(v)
  92. }
  93. case []float64:
  94. array = make([]uint, len(value))
  95. for k, v := range value {
  96. array[k] = Uint(v)
  97. }
  98. case []interface{}:
  99. array = make([]uint, len(value))
  100. for k, v := range value {
  101. array[k] = Uint(v)
  102. }
  103. case [][]byte:
  104. array = make([]uint, len(value))
  105. for k, v := range value {
  106. array[k] = Uint(v)
  107. }
  108. default:
  109. if v, ok := any.(apiUints); ok {
  110. return v.Uints()
  111. }
  112. if v, ok := any.(apiInterfaces); ok {
  113. return Uints(v.Interfaces())
  114. }
  115. // Not a common type, it then uses reflection for conversion.
  116. var reflectValue reflect.Value
  117. if v, ok := value.(reflect.Value); ok {
  118. reflectValue = v
  119. } else {
  120. reflectValue = reflect.ValueOf(value)
  121. }
  122. reflectKind := reflectValue.Kind()
  123. for reflectKind == reflect.Ptr {
  124. reflectValue = reflectValue.Elem()
  125. reflectKind = reflectValue.Kind()
  126. }
  127. switch reflectKind {
  128. case reflect.Slice, reflect.Array:
  129. var (
  130. length = reflectValue.Len()
  131. slice = make([]uint, length)
  132. )
  133. for i := 0; i < length; i++ {
  134. slice[i] = Uint(reflectValue.Index(i).Interface())
  135. }
  136. return slice
  137. default:
  138. return []uint{Uint(any)}
  139. }
  140. }
  141. return array
  142. }
  143. // Uint32s converts `any` to []uint32.
  144. func Uint32s(any interface{}) []uint32 {
  145. if any == nil {
  146. return nil
  147. }
  148. var array []uint32
  149. switch value := any.(type) {
  150. case string:
  151. if value == "" {
  152. return []uint32{}
  153. }
  154. return []uint32{Uint32(value)}
  155. case []string:
  156. array = make([]uint32, len(value))
  157. for k, v := range value {
  158. array[k] = Uint32(v)
  159. }
  160. case []int8:
  161. array = make([]uint32, len(value))
  162. for k, v := range value {
  163. array[k] = uint32(v)
  164. }
  165. case []int16:
  166. array = make([]uint32, len(value))
  167. for k, v := range value {
  168. array[k] = uint32(v)
  169. }
  170. case []int32:
  171. array = make([]uint32, len(value))
  172. for k, v := range value {
  173. array[k] = uint32(v)
  174. }
  175. case []int64:
  176. array = make([]uint32, len(value))
  177. for k, v := range value {
  178. array[k] = uint32(v)
  179. }
  180. case []uint:
  181. array = make([]uint32, len(value))
  182. for k, v := range value {
  183. array[k] = uint32(v)
  184. }
  185. case []uint8:
  186. array = make([]uint32, len(value))
  187. for k, v := range value {
  188. array[k] = uint32(v)
  189. }
  190. case []uint16:
  191. array = make([]uint32, len(value))
  192. for k, v := range value {
  193. array[k] = uint32(v)
  194. }
  195. case []uint32:
  196. array = value
  197. case []uint64:
  198. array = make([]uint32, len(value))
  199. for k, v := range value {
  200. array[k] = uint32(v)
  201. }
  202. case []bool:
  203. array = make([]uint32, len(value))
  204. for k, v := range value {
  205. if v {
  206. array[k] = 1
  207. } else {
  208. array[k] = 0
  209. }
  210. }
  211. case []float32:
  212. array = make([]uint32, len(value))
  213. for k, v := range value {
  214. array[k] = Uint32(v)
  215. }
  216. case []float64:
  217. array = make([]uint32, len(value))
  218. for k, v := range value {
  219. array[k] = Uint32(v)
  220. }
  221. case []interface{}:
  222. array = make([]uint32, len(value))
  223. for k, v := range value {
  224. array[k] = Uint32(v)
  225. }
  226. case [][]byte:
  227. array = make([]uint32, len(value))
  228. for k, v := range value {
  229. array[k] = Uint32(v)
  230. }
  231. default:
  232. if v, ok := any.(apiUints); ok {
  233. return Uint32s(v.Uints())
  234. }
  235. if v, ok := any.(apiInterfaces); ok {
  236. return Uint32s(v.Interfaces())
  237. }
  238. // Not a common type, it then uses reflection for conversion.
  239. var reflectValue reflect.Value
  240. if v, ok := value.(reflect.Value); ok {
  241. reflectValue = v
  242. } else {
  243. reflectValue = reflect.ValueOf(value)
  244. }
  245. reflectKind := reflectValue.Kind()
  246. for reflectKind == reflect.Ptr {
  247. reflectValue = reflectValue.Elem()
  248. reflectKind = reflectValue.Kind()
  249. }
  250. switch reflectKind {
  251. case reflect.Slice, reflect.Array:
  252. var (
  253. length = reflectValue.Len()
  254. slice = make([]uint32, length)
  255. )
  256. for i := 0; i < length; i++ {
  257. slice[i] = Uint32(reflectValue.Index(i).Interface())
  258. }
  259. return slice
  260. default:
  261. return []uint32{Uint32(any)}
  262. }
  263. }
  264. return array
  265. }
  266. // Uint64s converts `any` to []uint64.
  267. func Uint64s(any interface{}) []uint64 {
  268. if any == nil {
  269. return nil
  270. }
  271. var array []uint64
  272. switch value := any.(type) {
  273. case string:
  274. if value == "" {
  275. return []uint64{}
  276. }
  277. return []uint64{Uint64(value)}
  278. case []string:
  279. array = make([]uint64, len(value))
  280. for k, v := range value {
  281. array[k] = Uint64(v)
  282. }
  283. case []int8:
  284. array = make([]uint64, len(value))
  285. for k, v := range value {
  286. array[k] = uint64(v)
  287. }
  288. case []int16:
  289. array = make([]uint64, len(value))
  290. for k, v := range value {
  291. array[k] = uint64(v)
  292. }
  293. case []int32:
  294. array = make([]uint64, len(value))
  295. for k, v := range value {
  296. array[k] = uint64(v)
  297. }
  298. case []int64:
  299. array = make([]uint64, len(value))
  300. for k, v := range value {
  301. array[k] = uint64(v)
  302. }
  303. case []uint:
  304. array = make([]uint64, len(value))
  305. for k, v := range value {
  306. array[k] = uint64(v)
  307. }
  308. case []uint8:
  309. array = make([]uint64, len(value))
  310. for k, v := range value {
  311. array[k] = uint64(v)
  312. }
  313. case []uint16:
  314. array = make([]uint64, len(value))
  315. for k, v := range value {
  316. array[k] = uint64(v)
  317. }
  318. case []uint32:
  319. array = make([]uint64, len(value))
  320. for k, v := range value {
  321. array[k] = uint64(v)
  322. }
  323. case []uint64:
  324. array = value
  325. case []bool:
  326. array = make([]uint64, len(value))
  327. for k, v := range value {
  328. if v {
  329. array[k] = 1
  330. } else {
  331. array[k] = 0
  332. }
  333. }
  334. case []float32:
  335. array = make([]uint64, len(value))
  336. for k, v := range value {
  337. array[k] = Uint64(v)
  338. }
  339. case []float64:
  340. array = make([]uint64, len(value))
  341. for k, v := range value {
  342. array[k] = Uint64(v)
  343. }
  344. case []interface{}:
  345. array = make([]uint64, len(value))
  346. for k, v := range value {
  347. array[k] = Uint64(v)
  348. }
  349. case [][]byte:
  350. array = make([]uint64, len(value))
  351. for k, v := range value {
  352. array[k] = Uint64(v)
  353. }
  354. default:
  355. if v, ok := any.(apiUints); ok {
  356. return Uint64s(v.Uints())
  357. }
  358. if v, ok := any.(apiInterfaces); ok {
  359. return Uint64s(v.Interfaces())
  360. }
  361. // Not a common type, it then uses reflection for conversion.
  362. var reflectValue reflect.Value
  363. if v, ok := value.(reflect.Value); ok {
  364. reflectValue = v
  365. } else {
  366. reflectValue = reflect.ValueOf(value)
  367. }
  368. reflectKind := reflectValue.Kind()
  369. for reflectKind == reflect.Ptr {
  370. reflectValue = reflectValue.Elem()
  371. reflectKind = reflectValue.Kind()
  372. }
  373. switch reflectKind {
  374. case reflect.Slice, reflect.Array:
  375. var (
  376. length = reflectValue.Len()
  377. slice = make([]uint64, length)
  378. )
  379. for i := 0; i < length; i++ {
  380. slice[i] = Uint64(reflectValue.Index(i).Interface())
  381. }
  382. return slice
  383. default:
  384. return []uint64{Uint64(any)}
  385. }
  386. }
  387. return array
  388. }