断言的疑惑

jroam05 · 2018-07-18 10:49:04 · 1143 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-07-18 10:49:04 的主题,其中的信息可能已经有所发展或是发生改变。

请问下: 下面的示例代码中,为什么第二种断言才能成功,第一种断言不成功?

json1 := `[{"aa":"astr1"},{"aa":"bstr1"}]`
    var j1 []interface{}
    json.Unmarshal([]byte(json1), &j1)

    for k, v := range j1 {
        fmt.Println(k, reflect.TypeOf(v).String())
        if v2, ok := v.(map[string]string); ok {
            println("断言成功")
            println(v2["aa"])
        } else if v2, ok := v.(map[string]interface{}); ok {
            fmt.Println("键值为interface:")
            fmt.Println(v2["aa"])
        } else {
            fmt.Println("失败:")
        }
    }

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1143 次点击  
加入收藏 微博
3 回复  |  直到 2019-10-08 10:41:36
wwcd
wwcd · #1 · 7年之前

手册里面写的很明天,对objects是map[string]interface{}

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

https://golang.google.cn/pkg/encoding/json/#Unmarshal

anko
anko · #2 · 5年之前

断言222.png
应该是因为每次断言只能断言一个点!!

jan-bar
jan-bar · #3 · 5年之前

你都打印了类型"fmt.Println(k, reflect.TypeOf(v).String())",必须完全保持一致啊。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传