为了账号安全,请及时绑定邮箱和手机立即绑定

go:接口类型断言

go:接口类型断言

Go
眼眸繁星 2021-12-13 18:30:45
我在制作结构的动态模型时遇到问题。我的意思是我想断言或强制转换,或者只是根据传入的数据支柱更改结构的类型。如果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以严格的方式设置类型?
查看完整描述

1 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

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


例子:


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


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号