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  }