go:输入接口(interface)的断言

标签 go types

我在制作结构的动态模型时遇到问题。我的意思是我想断言或强制转换,或者只是根据传入的数据支柱更改结构的类型。

如果 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/

相关文章:

c++ - 检查 std::any 变量是否包含 std::string 时出现问题

go - 如何更正 "if"构造中的类型比较

go - 如何在Go-gin中的中间件之间共享变量

pointers - 可选择将 .Where() 应用于 gorm.DB

object - Go:结构中的方法和方法的 slice

Excel 新数据类型

types - "conflicting implementations for trait"尝试通用时

macos - 如何分发 OSX cli/server 应用程序

eclipse - 如何在 GoClipse 中启用自动导入?

Java transient 变量类型必须知道序列化?