gconv_slice_int.go 8.5 KB

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