Сохранение поля структуры, доступ к которому осуществляется через отражение

Я беру параметры квеста для своей игры из CSV. Параметры включают отслеживаемую статистику, например, «CardsDeployed», и условия того, какие карты подходят для этого квеста. Условие может быть чем-то вроде «Стоимость:4», где Стоимость соответствует полю в структуре внутри моей программы:

      type template struct {
    Cost int
    // other parameters
}

У меня есть статистика игрока, которая сопоставляет шаблоны карточек с желаемой статистикой, например

      playerStats["CardsDeployed"] = map[template]uint{}

Учитывая условие квеста, как мне отфильтровать эту карту для всех шаблонов, соответствующих этому условию? Я знаю, что могу сделать это, отражая конкретное значение каждого шаблона на карте и получая доступ к нужному полю, используя имя поля («Стоимость»), но это кажется очень дорогим (это на игровом сервере, поэтому должно быть делается часто для многих игроков). Я не могу преобразовать шаблон в общий интерфейс map[string]{}, потому что он используется во всем моем коде, и поэтому мне нужно, чтобы он был строго типизирован.

TLDR: есть ли способ сохранить ссылку на поле типа структуры (здесь шаблон), которую затем можно использовать для доступа к этому конкретному полю из любого конкретного экземпляра этой структуры? Я уже знаю макет структуры и все квесты, когда моя программа запускается, поэтому в этом случае мне нужно только один раз запустить отражение и сохранить ссылку на поле.

Пожалуйста, дайте мне знать, если какие-либо дополнительные детали помогут. Спасибо!

1 ответ

Поскольку вы упомянули, что мой комментарий был решением, которое вы выбрали, чтобы «решить» проблему. Я думаю, это должен быть ответ. Так:

В случае, если имя поля доступно вам только в виде строки, вам может быть лучше дать шаблону метод GetValue(name string)или что-то и использовать map[string]interface{}в templateструктура для хранения всех значений. Если с одной стороны у вас есть большой динамический список имен полей, возможно, структура со статическими именами полей — не лучший способ хранения данных?

      type template struct {
    data map[string]interface{}
}

func (t *template) GetValue(name string) interface{} {
   if v, ok := t.data[name]; ok {
      return v
   }
   return nil
}
Другие вопросы по тегам