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

Go:地图的类型断言

Go:地图的类型断言

Go
料青山看我应如是 2021-12-20 10:39:49
我正在从 JSON 读取数据结构。有一些转换正在进行,最后我有一个struct字段,其中一个是 type interface{}。它实际上是一张地图,所以 JSON 将它放在一个map[string]inteface{}.我实际上知道底层结构是map[string]float64并且我想这样使用它,所以我尝试做一个断言。以下代码重现了该行为:type T interface{}func jsonMap() T {    result := map[string]interface{}{        "test": 1.2,    }    return T(result)}func main() {    res := jsonMap()    myMap := res.(map[string]float64)    fmt.Println(myMap)}我收到错误:panic: interface conversion: main.T is map[string]interface {}, not map[string]float64我可以执行以下操作:func main() {    // A first assertion    res := jsonMap().(map[string]interface{})    myMap := map[string]float64{        "test": res["test"].(float64), // A second assertion    }    fmt.Println(myMap)}这工作正常,但我发现它非常难看,因为我需要重建整个地图并使用两个断言。有没有正确的方法来强制第一个断言放弃interface{}并使用float64?换句话说,做原始断言的正确方法是什么.(map[string]float64)?
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

不能键入断言map[string]interface{}到map[string]float64。您需要手动创建新地图。


package main


import (

    "encoding/json"

    "fmt"

)


var exampleResponseData = `{

        "Data":[

            {

                "Type":"pos",

                "Content":{

                    "x":0.5,

                    "y":0.3

                }

            },

            {

                "Type":"vel",

                "Content":{

                    "vx":0.1,

                    "vy":-0.2

                }

            }

        ]

    }`


type response struct {

    Data []struct {

        Type    string

        Content interface{}

    }

}


func main() {

    var response response

    err := json.Unmarshal([]byte(exampleResponseData), &response)

    if err != nil {

        fmt.Println("Cannot process not valid json")

    }


    for i := 0; i < len(response.Data); i++ {

        response.Data[i].Content = convertMap(response.Data[i].Content)

    }

}


func convertMap(originalMap interface{}) map[string]float64 {

    convertedMap := map[string]float64{}

    for key, value := range originalMap.(map[string]interface{}) {

        convertedMap[key] = value.(float64)

    }


    return convertedMap

}

你确定你不能定义Content为 map[string]float64?请参阅下面的示例。如果没有,你怎么知道你可以首先投射它?


type response struct {

    Data []struct {

        Type    string

        Content map[string]float64

    }

}


var response response

err := json.Unmarshal([]byte(exampleResponseData), &response)


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信