Сохранение поля структуры, доступ к которому осуществляется через отражение
Я беру параметры квеста для своей игры из 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
}