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