Создать срез с динамической структурой - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь создать функцию, которая получает пустую структуру и возвращает фрагмент этого типа структуры.

Например -

type MyStruct struct {
  Id            int
}
type MyOtherStruct struct {
  Name          string
}

getDynamicSlice(MyStruct{}) // will return []MyStruct{}
getDynamicSlice(MyOtherStruct{}) // will return []MyOtherStruct{}

Каков наилучший способ реализации такой функциина ходу?

1 Ответ

1 голос
/ 15 октября 2019

Вы можете использовать переключатель типа:

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 тоже просто интерфейс. Таким образом, вся обработка ошибок может использовать переключатели типа, подобные этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...