github.com/gogf/gf@v1.16.9/util/gconv/gconv_slice_str.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  // SliceStr is alias of Strings.
    12  func SliceStr(any interface{}) []string {
    13  	return Strings(any)
    14  }
    15  
    16  // Strings converts `any` to []string.
    17  func Strings(any interface{}) []string {
    18  	if any == nil {
    19  		return nil
    20  	}
    21  	var array []string
    22  	switch value := any.(type) {
    23  	case []int:
    24  		array = make([]string, len(value))
    25  		for k, v := range value {
    26  			array[k] = String(v)
    27  		}
    28  	case []int8:
    29  		array = make([]string, len(value))
    30  		for k, v := range value {
    31  			array[k] = String(v)
    32  		}
    33  	case []int16:
    34  		array = make([]string, len(value))
    35  		for k, v := range value {
    36  			array[k] = String(v)
    37  		}
    38  	case []int32:
    39  		array = make([]string, len(value))
    40  		for k, v := range value {
    41  			array[k] = String(v)
    42  		}
    43  	case []int64:
    44  		array = make([]string, len(value))
    45  		for k, v := range value {
    46  			array[k] = String(v)
    47  		}
    48  	case []uint:
    49  		array = make([]string, len(value))
    50  		for k, v := range value {
    51  			array[k] = String(v)
    52  		}
    53  	case []uint8:
    54  		array = make([]string, len(value))
    55  		for k, v := range value {
    56  			array[k] = String(v)
    57  		}
    58  	case []uint16:
    59  		array = make([]string, len(value))
    60  		for k, v := range value {
    61  			array[k] = String(v)
    62  		}
    63  	case []uint32:
    64  		array = make([]string, len(value))
    65  		for k, v := range value {
    66  			array[k] = String(v)
    67  		}
    68  	case []uint64:
    69  		array = make([]string, len(value))
    70  		for k, v := range value {
    71  			array[k] = String(v)
    72  		}
    73  	case []bool:
    74  		array = make([]string, len(value))
    75  		for k, v := range value {
    76  			array[k] = String(v)
    77  		}
    78  	case []float32:
    79  		array = make([]string, len(value))
    80  		for k, v := range value {
    81  			array[k] = String(v)
    82  		}
    83  	case []float64:
    84  		array = make([]string, len(value))
    85  		for k, v := range value {
    86  			array[k] = String(v)
    87  		}
    88  	case []interface{}:
    89  		array = make([]string, len(value))
    90  		for k, v := range value {
    91  			array[k] = String(v)
    92  		}
    93  	case []string:
    94  		array = value
    95  	case [][]byte:
    96  		array = make([]string, len(value))
    97  		for k, v := range value {
    98  			array[k] = String(v)
    99  		}
   100  	default:
   101  		if v, ok := any.(apiStrings); ok {
   102  			return v.Strings()
   103  		}
   104  		if v, ok := any.(apiInterfaces); ok {
   105  			return Strings(v.Interfaces())
   106  		}
   107  		// Not a common type, it then uses reflection for conversion.
   108  		var reflectValue reflect.Value
   109  		if v, ok := value.(reflect.Value); ok {
   110  			reflectValue = v
   111  		} else {
   112  			reflectValue = reflect.ValueOf(value)
   113  		}
   114  		reflectKind := reflectValue.Kind()
   115  		for reflectKind == reflect.Ptr {
   116  			reflectValue = reflectValue.Elem()
   117  			reflectKind = reflectValue.Kind()
   118  		}
   119  		switch reflectKind {
   120  		case reflect.Slice, reflect.Array:
   121  			var (
   122  				length = reflectValue.Len()
   123  				slice  = make([]string, length)
   124  			)
   125  			for i := 0; i < length; i++ {
   126  				slice[i] = String(reflectValue.Index(i).Interface())
   127  			}
   128  			return slice
   129  
   130  		default:
   131  			return []string{String(any)}
   132  		}
   133  	}
   134  	return array
   135  }