【问题标题】:go: type assert of interfacego:输入接口的断言
【发布时间】:2016-05-26 08:40:52
【问题描述】:

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

如果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类型?

【问题讨论】:

    标签: go types


    【解决方案1】:

    可以使用reflect 包在运行时动态创建一个类型的实例。您可以使用地图来存储您应该能够创建的不同类型:

    示例:

    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

    【讨论】:

    • 谢谢,我记得这种切换方式
    • @Altenrion 欢迎 :) 。当然,您也可以使用普通开关:switch sourceName { case "foo": deserializedData = new(Foo) ... }。然后你可以避免使用reflect。如果您希望其他包能够添加源类型(例如,如果您正在编写 jsonrpc 库),则使用映射很好。如果您有一组有限且静态的类型,则最好使用普通开关。任你选:)
    猜你喜欢
    • 2021-02-10
    • 2021-06-22
    • 2017-02-09
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多