go - 保存类型以供以后反射

标签 go types casting

我正在尝试做这样的事情:

结构保存设置:

type Setting struct{
    Name            string
    DataType        types.Type
}

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

然后,使用反射和DataType上的值从Map中获取值:
// 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
}

我不会这样做,以确保“获取”始终返回该设置的预期值。如果它是无效的,则返回默认值,因此我不必再次检查代码。

仅做var:= setting.Get()。(setting.DataType)就足够了,不需要检查。

我也尝试过使用Reflection.kind保存设置的类型。那可以存储它,但是我不能用它来解析后者:

使用reflect.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)

所以。关于我该怎么做的任何想法?
存储一个类型,并将其与反射一起使用?

最佳答案

您可以使用/存储 reflect.Type 。在Get()中,您可以检查该值是否为该类型,例如reflect.TypeOf(settings[s]) == s.DataType

但是,仅使用结构并将枚举设置作为字段会更简单。这将是类型安全的,并且在使用/获取设置值时不必使用类型断言。

关于go - 保存类型以供以后反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60027568/

相关文章:

swift - 在 Swift 中将字符串转换为 double

debugging - LiteIDE 调试消息没有指定可执行文件使用目标 exec

select - golang : goroute with select doesn't stop unless I added a fmt. 打印()

haskell - Pointfree 版本无法编译,但有针对性的版本可以吗?

PHP 字符串比较,用于比较在某些 View 中看起来相同但在其他 View 中看起来不同的字符串

java - 为什么 Java 允许将类型 Object 的表达式显式转换为 A<B<C>>,将 A<?> 类型的表达式显式转换为 A<B<C>>,但不允许将 A<B<?>> 类型的表达式显式转换为 A<B <C>>?

arrays - 解析显式数组

go - 尝试提供 Gin Gonic 应用程序时出现紧急错误

haskell - 编写函数 (a -> b -> ... -> t) -> (Monad m => m a -> m b -> ... -> m t)

core-data - 将 NSManagedObject 转换为子类类型时出现问题