Когда вводит тип (to) конкретного типа, вы можете вводить только тот тип, который хранится в значении интерфейса, но не его базовый тип.Конечно, когда у вас есть конкретный тип, вы можете преобразовать в базовый тип.
Вы сказали, что хотите избежать этого, вы хотите избежать обращения к конкретному типу.
Для этого вам понадобится рефлексия.Получите дескриптор значения reflect.Value
и используйте метод Value.Convert()
для "прямого" преобразования в его базовый тип, пропуская "фактический" тип.Это будет успешно, потому что значение может быть преобразовано в значение его базового типа.
Конечно, метод Value.Convert()
даст значение типа reflect.Value
(а не []interface{}
), но вы можетеполучите значение interface{}
, заключив это в Value.Interface()
.Теперь у вас будет interface{}
, заключающий в себе конкретное значение типа []interface{}
, из которого вы теперь можете набрать assert значение типа []interface{}
.
См. Этот пример:
z := reflect.ValueOf(y).Convert(reflect.TypeOf([]interface{}{})).
Interface().([]interface{})
fmt.Printf("%T %v", z, z)
Вывод (попробуйте на Go Playground ):
[]interface {} [b c]
Здесь много шаблонов, и это будет не так эффективно, как простое утверждение типаи преобразование.Старайтесь не делать это таким образом.