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 }