我正在跟进Golang 将通用 JSON 对象解码为多种格式之一,作为解组通用 json 的一种方式。我将有许多不同的类型,其他人可以添加这些类型,因此硬编码 case 语句是不可行的。
我也不想将类型硬编码为字符串,但让使用库的人选择“查找”名称,以防他们以后想重命名其底层结构。
我基本上是在寻找这样的东西:
type myInterface interface {
Something() // irrelevant, just to show you It's not about interface{}
}
type myBar struct {} // fulfils myInterface
type mySomething struct {} // fulfils myInterface
var types = make(map[string]type) // <--- Obvious Pseudo code ;)
types["foo:bar"] = myBar // done by whoever uses the library
types["1230988"] = mySomething // ...
type storageWrapper struct {
Type string
Data json.RawMessage
}
func loadSomething(id string) myInterface {
buf := db.load(id) // pseudo code but you get the idea
sw := &storageWrapper{}
json.Unmarshal(buf, sw)
// now the interesting part
targetType := types[sw.Type]
thing := &targetType{}
json.Unmarshal(sw.Data, thing)
return thing
}
我有一种感觉,我把整个问题想得太多了。或者我试图将 Go 转变为与其基本哲学相冲突的东西。我非常开放并感谢任何建议对整个问题提出不同的方法
MMTTMM
相关分类