Сохранить тип для последующего отражения - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь сделать что-то вроде этого:

Структура для сохранения настройки:

type Setting struct{
    Name            string
    DataType        types.Type
}

Определение настройки:

var SETTING_DebugLogging Setting = Setting{
    Name: "DebugLogging",
    DataType: bool,    <-- This is wrong
}

, а затем получить значение из карты с использованием отражения и значение в DataType:

// Get a value setting, or his default
func (s Setting) Get() interface{}{
    val, ok := settings[s].(s.DataType)    <-- This is wrong
    if !ok{
        return s.DefaultValue.(s.DataType)   <-- This is wrong
    }

    return val
}

Я не хочу этого делать, чтобы «Get» всегда возвращал значение, ожидаемое для этого параметра. Если он неверный, возвращает значение по умолчанию, поэтому мне не нужно проверять снова в коде.

Достаточно просто сделать var: = setting.Get (). (Setting.DataType), нет Необходимые проверки.

Я также пытался использовать отражение.kind, чтобы сохранить тип настройки. И это работает для его хранения, но я не могу использовать его для анализа последнего:

Это нормально с отражением. Вид:

// Game to launch
var SETTING_GameToLaunch Setting = Setting{
    Name: "GameToLaunch",
    DataType: reflect.Bool,
    DefaultValue: 2,
}

Но последнее не работает:

func (s Setting) Get() interface{}{
    val, ok := settings[s].(s.DataType)

Итак. Любые идеи о том, как я могу это сделать? Сохранить тип и использовать последний с отражением?

1 Ответ

2 голосов
/ 02 февраля 2020

Вы можете использовать / хранить reflect.Type. В Get() вы можете проверить, относится ли значение к этому типу, например, reflect.TypeOf(settings[s]) == s.DataType.

Но было бы проще просто использовать структуру и перечислять настройки в качестве полей. Это будет безопасно для типов, и вам не нужно использовать утверждения типа при использовании / получении значений параметров.

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