我在制作结构的动态模型时遇到问题。我的意思是我想断言或强制转换,或者只是根据传入的数据支柱更改结构的类型。
如果 sourceName
变量将是 type_x
, 比 deserializedData
的类型应该是 type_x
, 如果 type_y
, 比 type_y
.如何设置变量deserializedData
动态为此?
我的代码中有这一部分:
....
var cacheData []byte
var deserializedData models.NoaggModel
cache_err := cache.Get(string(string(sourceName) + "_" + string(t.Date)), &cacheData);
if cache_err != nil {
fmt.Println("cache_error: ", cache_err)
panic("the cache is empty")
}
err2 := json.Unmarshal([]byte(cacheData), &deserializedData)
if err2 == nil {
fmt.Println("deserialized data: " + string(sourceName), deserializedData)
}
for _, chart := range charts {
w.Name = chart.Name
if err2 == nil {
w.Data = countDataByName(sourceName, deserializedData, t.Request.Filters, string(chart.Name))
}
out <- w
}
....
如何修改它,避免设置
models.Noagg Model
严格输入?
最佳答案
可以使用 reflect 在运行时动态创建类型的实例。包裹。您可以使用 map 来存储您应该能够创建的不同类型:
示例:
package main
import (
"fmt"
"reflect"
)
type Foo struct {
Foo string
}
type Bar struct {
Bar int
}
func main() {
var sourceTypes = map[string]reflect.Type{
"foo": reflect.TypeOf(Foo{}),
"bar": reflect.TypeOf(Bar{}),
}
sourceName := "foo"
var deserializedData interface{}
deserializedData = reflect.New(sourceTypes[sourceName]).Interface()
fmt.Printf("%#v", deserializedData)
}
输出:
&main.Foo{Foo:""}
游乐场: http://play.golang.org/p/qeDA4cu5et
关于go:输入接口(interface)的断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35409342/