gconv_slice_int.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  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. // SliceInt is alias of Ints.
  9. func SliceInt(i interface{}) []int {
  10. return Ints(i)
  11. }
  12. // SliceInt32 is alias of Int32s.
  13. func SliceInt32(i interface{}) []int32 {
  14. return Int32s(i)
  15. }
  16. // SliceInt is alias of Int64s.
  17. func SliceInt64(i interface{}) []int64 {
  18. return Int64s(i)
  19. }
  20. // Ints converts <i> to []int.
  21. func Ints(i interface{}) []int {
  22. if i == nil {
  23. return nil
  24. }
  25. var array []int
  26. switch value := i.(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 := i.(apiInts); ok {
  115. return v.Ints()
  116. }
  117. if v, ok := i.(apiInterfaces); ok {
  118. return Ints(v.Interfaces())
  119. }
  120. // Use reflect feature at last.
  121. rv := reflect.ValueOf(i)
  122. switch rv.Kind() {
  123. case reflect.Slice, reflect.Array:
  124. length := rv.Len()
  125. array = make([]int, length)
  126. for n := 0; n < length; n++ {
  127. array[n] = Int(rv.Index(n).Interface())
  128. }
  129. default:
  130. return []int{Int(i)}
  131. }
  132. }
  133. return array
  134. }
  135. // Int32s converts <i> to []int32.
  136. func Int32s(i interface{}) []int32 {
  137. if i == nil {
  138. return nil
  139. }
  140. var array []int32
  141. switch value := i.(type) {
  142. case string:
  143. if value == "" {
  144. return []int32{}
  145. }
  146. return []int32{Int32(value)}
  147. case []string:
  148. array = make([]int32, len(value))
  149. for k, v := range value {
  150. array[k] = Int32(v)
  151. }
  152. case []int:
  153. array = make([]int32, len(value))
  154. for k, v := range value {
  155. array[k] = int32(v)
  156. }
  157. case []int8:
  158. array = make([]int32, len(value))
  159. for k, v := range value {
  160. array[k] = int32(v)
  161. }
  162. case []int16:
  163. array = make([]int32, len(value))
  164. for k, v := range value {
  165. array[k] = int32(v)
  166. }
  167. case []int32:
  168. array = value
  169. case []int64:
  170. array = make([]int32, len(value))
  171. for k, v := range value {
  172. array[k] = int32(v)
  173. }
  174. case []uint:
  175. array = make([]int32, len(value))
  176. for k, v := range value {
  177. array[k] = int32(v)
  178. }
  179. case []uint8:
  180. array = make([]int32, len(value))
  181. for k, v := range value {
  182. array[k] = int32(v)
  183. }
  184. case []uint16:
  185. array = make([]int32, len(value))
  186. for k, v := range value {
  187. array[k] = int32(v)
  188. }
  189. case []uint32:
  190. array = make([]int32, len(value))
  191. for k, v := range value {
  192. array[k] = int32(v)
  193. }
  194. case []uint64:
  195. array = make([]int32, len(value))
  196. for k, v := range value {
  197. array[k] = int32(v)
  198. }
  199. case []bool:
  200. array = make([]int32, len(value))
  201. for k, v := range value {
  202. if v {
  203. array[k] = 1
  204. } else {
  205. array[k] = 0
  206. }
  207. }
  208. case []float32:
  209. array = make([]int32, len(value))
  210. for k, v := range value {
  211. array[k] = Int32(v)
  212. }
  213. case []float64:
  214. array = make([]int32, len(value))
  215. for k, v := range value {
  216. array[k] = Int32(v)
  217. }
  218. case []interface{}:
  219. array = make([]int32, len(value))
  220. for k, v := range value {
  221. array[k] = Int32(v)
  222. }
  223. case [][]byte:
  224. array = make([]int32, len(value))
  225. for k, v := range value {
  226. array[k] = Int32(v)
  227. }
  228. default:
  229. if v, ok := i.(apiInts); ok {
  230. return Int32s(v.Ints())
  231. }
  232. if v, ok := i.(apiInterfaces); ok {
  233. return Int32s(v.Interfaces())
  234. }
  235. return []int32{Int32(i)}
  236. }
  237. return array
  238. }
  239. // Int64s converts <i> to []int64.
  240. func Int64s(i interface{}) []int64 {
  241. if i == nil {
  242. return nil
  243. }
  244. var array []int64
  245. switch value := i.(type) {
  246. case string:
  247. if value == "" {
  248. return []int64{}
  249. }
  250. return []int64{Int64(value)}
  251. case []string:
  252. array = make([]int64, len(value))
  253. for k, v := range value {
  254. array[k] = Int64(v)
  255. }
  256. case []int:
  257. array = make([]int64, len(value))
  258. for k, v := range value {
  259. array[k] = int64(v)
  260. }
  261. case []int8:
  262. array = make([]int64, len(value))
  263. for k, v := range value {
  264. array[k] = int64(v)
  265. }
  266. case []int16:
  267. array = make([]int64, len(value))
  268. for k, v := range value {
  269. array[k] = int64(v)
  270. }
  271. case []int32:
  272. array = make([]int64, len(value))
  273. for k, v := range value {
  274. array[k] = int64(v)
  275. }
  276. case []int64:
  277. array = value
  278. case []uint:
  279. array = make([]int64, len(value))
  280. for k, v := range value {
  281. array[k] = int64(v)
  282. }
  283. case []uint8:
  284. array = make([]int64, len(value))
  285. for k, v := range value {
  286. array[k] = int64(v)
  287. }
  288. case []uint16:
  289. array = make([]int64, len(value))
  290. for k, v := range value {
  291. array[k] = int64(v)
  292. }
  293. case []uint32:
  294. array = make([]int64, len(value))
  295. for k, v := range value {
  296. array[k] = int64(v)
  297. }
  298. case []uint64:
  299. array = make([]int64, len(value))
  300. for k, v := range value {
  301. array[k] = int64(v)
  302. }
  303. case []bool:
  304. array = make([]int64, len(value))
  305. for k, v := range value {
  306. if v {
  307. array[k] = 1
  308. } else {
  309. array[k] = 0
  310. }
  311. }
  312. case []float32:
  313. array = make([]int64, len(value))
  314. for k, v := range value {
  315. array[k] = Int64(v)
  316. }
  317. case []float64:
  318. array = make([]int64, len(value))
  319. for k, v := range value {
  320. array[k] = Int64(v)
  321. }
  322. case []interface{}:
  323. array = make([]int64, len(value))
  324. for k, v := range value {
  325. array[k] = Int64(v)
  326. }
  327. case [][]byte:
  328. array = make([]int64, len(value))
  329. for k, v := range value {
  330. array[k] = Int64(v)
  331. }
  332. default:
  333. if v, ok := i.(apiInts); ok {
  334. return Int64s(v.Ints())
  335. }
  336. if v, ok := i.(apiInterfaces); ok {
  337. return Int64s(v.Interfaces())
  338. }
  339. return []int64{Int64(i)}
  340. }
  341. return array
  342. }