Итак, вы хотите «общий» тип, который может содержать любой тип объекта? Пакет datastore
уже предоставляет вам такой тип: datastore.PropertyList
.
Вот как это можно использовать:
var entity datastore.PropertyList
if err := client.Get(ctx, key, &entity); err != nil {
// TODO: Handle error.
}
Соответствующие документы от datastore
:
Свойства
Содержимое сущности может быть представлено различными типами. Обычно это указатели на структуру, но также могут быть любые типы, которые реализуют интерфейс PropertyLoadSaver. Если вы используете указатель структуры, вам не нужно явно реализовывать интерфейс PropertyLoadSaver; хранилище данных автоматически преобразуется с помощью отражения. Если указатель структуры действительно реализует этот интерфейс, то эти методы будут использоваться в предпочтении поведению по умолчанию для указателей структуры. Структурные указатели напечатаны более строго и их проще использовать; PropertyLoadSavers более гибкие.
Таким образом, вы можете использовать любой тип, который реализует интерфейс datastore.PropertyLoadSaver
. Этот тип интерфейса:
type PropertyLoadSaver interface {
Load([]Property) error
Save() ([]Property, error)
}
Повторное цитирование из пакета документов :
Интерфейс PropertyLoadSaver
Содержимое сущности также может быть представлено любым типом, который реализует интерфейс PropertyLoadSaver. Этот тип может быть указателем структуры, но это не обязательно. Пакет хранилища данных будет вызывать Load при получении содержимого объекта и Save при помещении содержимого объекта. Возможное использование включает получение несохраненных полей, проверку полей или индексацию поля, только если его значение положительное.
[...] Тип * PropertyList реализует PropertyLoadSaver и поэтому может содержать содержимое произвольной сущности.