Вы можете использовать переключатель типа:
func getStruct(i interface{}) interface{} {
switch s := i.(type) {
case MyStruct:
// do something here with type MyStruct
s.ID = 3
return s
case MyOtherStruct:
// ...
s.Name = "abc"
return s
}
return i
}
https://play.golang.org/p/iTlYP9yYuQw
НО вы должны обращаться с этим осторожно, потому что Go строго относится к типам. Вы должны соблюдать это.
Когда вы вызываете эту функцию, вы должны использовать утверждение типа, чтобы снова получить правильный тип:
s, ok := getStruct(MyStruct{}).(MyStruct)
if !ok {
// ...
}
fmt.Println(s)
Еще немного информации об этом шаблоне
Поскольку многие комментарии по этому вопросу касаются не использования interface{}
Я хочу написать здесь больше о сценарии использования. Интерфейсы в целом не имеют конкретной информации о типе. Не имеет значения, используете ли вы interface{}
или io.Reader
. Оба интерфейса не позволяют вам получить доступ к параметрам значения в интерфейсе. Вы должны всегда думать об этом, когда говорите о пустых интерфейсах.
Так что, если ваша функция возвращает интерфейс, у вас всегда будут проблемы такого рода. Я думаю, что почти все уже сделали много функций, которые возвращают интерфейс. Потому что error
тоже просто интерфейс. Таким образом, вся обработка ошибок может использовать переключатели типа, подобные этому.