Цель интерфейса - определить поведение, которое вы хотите использовать. Если вы используете пустой интерфейс, вы ничего не знаете о типах в этом срезе.
Если вы хотите распечатать его, вы можете использовать println или printf без преобразования.
Если вы хотите получить к нему доступ и должны разрешить любой тип, вы можете использовать отражение (медленно и сложноиспользовать).
Если вы хотите получить к нему доступ и использовать общее поведение / данные, для которых вы можете определить функции, определите интерфейс, например:
type Doer interface {
Do() error
}
parentStruct := []Doer{...}
testStruct.Do()
Если ничего из этого не работаетДождись Go 2 и дженериков.