Поскольку строка [] и интерфейс [] {} являются разными типами, вы не можете назначить один другому.
Вы должны скопировать фрагмент, чтобы преобразовать интерфейс [] {} в фрагмент некоторыхконкретный тип.Если вы знаете, что интерфейс [] {} всегда содержит строковые значения, тогда используйте следующее:
func stringSlice() []string {
a := []interface{}{"first", "second"} // query result
fmt.Println(a)
result := make([]string, len(a))
for i := range a {
var ok bool
result[i], ok = a[i].(string)
if !ok {
// handle error with unexpected type
}
}
return result
}
Если результат может иметь произвольные типы элементов, тогда используйте отражение , чтобы скопироватьломтик:
func anySlice(result interface{}) {
a := []interface{}{"first", "second"} // query result
slice := reflect.ValueOf(result).Elem()
elementType := slice.Type().Elem()
for _, v := range a {
rv := reflect.ValueOf(v)
if !rv.Type().AssignableTo(elementType) {
// handle error with unexpected type
}
slice.Set(reflect.Append(slice, rv))
}
}
Используйте это так:
var s []string
anySlice(&s)
пример игровой площадки