Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 类型断言嵌套接口_Go_Type Assertion - Fatal编程技术网

Go 类型断言嵌套接口

Go 类型断言嵌套接口,go,type-assertion,Go,Type Assertion,I json.Unmarshal json到接口{}。我不能输入并断言它 有人知道怎么回事吗?例如 package main import ( "encoding/json" "log" ) func somefunc(data interface{}) { log.Printf("%T\n", data) // Prints: map[string]interface {} log.Println(data) // Correctly pri

I json.Unmarshal json到接口{}。我不能输入并断言它

有人知道怎么回事吗?

例如

package main

import (
    "encoding/json"
    "log"
)

func somefunc(data interface{}) {
    log.Printf("%T\n", data)
    // Prints: map[string]interface {}
    log.Println(data)
    // Correctly prints: map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]

    ndata, _ := data.(map[string]interface{})
    log.Println(ndata)
    // Should print: map[key1:[map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]

    key_data, _ := ndata["key1"]
    log.Println(key_data)
    // Should print: [map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]
}

func main() {
    b := []byte(`{"key1":[{"apple":"A", "banana":"B", "id": "C"},{"cupcake": "C", "pinto":"D"}]}`)
    var m interface{}
    _ = json.Unmarshal(b, &m)
    somefunc(m)
}
输出:

2012/10/18 18:21:43 map[string]interface {}
2012/10/18 18:21:43 map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
2012/10/18 18:21:43 map[key1:[map[banana:B apple:A id:C] map[pinto:D cupcake:C]]]
2012/10/18 18:21:43 [map[banana:B apple:A id:C] map[pinto:D cupcake:C]]
比如说,

package main

import (
    "encoding/json"
    "log"
)

func somefunc(data interface{}) {
    log.Printf("%T\n", data)
    // Prints: map[string]interface {}
    log.Println(data)
    // Correctly prints: map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]

    ndata, _ := data.(map[string]interface{})
    log.Println(ndata)
    // Should print: map[key1:[map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]

    key_data, _ := ndata["key1"]
    log.Println(key_data)
    // Should print: [map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]
}

func main() {
    b := []byte(`{"key1":[{"apple":"A", "banana":"B", "id": "C"},{"cupcake": "C", "pinto":"D"}]}`)
    var m interface{}
    _ = json.Unmarshal(b, &m)
    somefunc(m)
}
输出:

2012/10/18 18:21:43 map[string]interface {}
2012/10/18 18:21:43 map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
2012/10/18 18:21:43 map[key1:[map[banana:B apple:A id:C] map[pinto:D cupcake:C]]]
2012/10/18 18:21:43 [map[banana:B apple:A id:C] map[pinto:D cupcake:C]]

如果您需要一种简单的方法来处理嵌套的JSON数据,我已经编写了一个包:


这减轻了在每个级别都必须键入assert的痛苦。有关说明,请参阅文档。

如果您需要一种简单的方法来处理嵌套的JSON数据,我已经编写了一个包:


这减轻了在每个级别都必须键入assert的痛苦。有关说明,请参阅文档。

您可以发布更多代码吗?而且看不到任何错误。谢谢你的网站。我用那个网站上的坏代码更新了我的例子,并在这里内联。你能发布更多的代码吗?而且看不到任何错误。谢谢你的网站。我在那个网站上用坏代码更新了我的示例,并在这里内联。谢谢,data.map[string]接口{}负责第一级,但在那之后,我不能在ndata[key1]中键入assert。哦,我明白了。我将循环遍历这些,并直接键入assert。谢谢。我已经修改了我的示例,以展示如何使用Printf和%T来判断类型。谢谢,data.map[string]接口{}负责第一级,但是在ndata[key1]中,我不能在之后键入断言。哦,我明白了。我将循环遍历这些,并直接键入assert。谢谢。我已经修改了我的示例,以展示如何使用Printf和%T来判断类型。