我正在尝试做这样的事情:
结构保存设置:
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/