json.Unmarshal和interface问题请教

eric642 · 2021-06-23 15:08:14 · 4687 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-06-23 15:08:14 的主题,其中的信息可能已经有所发展或是发生改变。

func main() {
    //testMidAndGroup()
    testI()
}

type t1 interface {
    Op()
}

type t1i struct {
    I int `json:"i"`
}

func (t *t1i) Op() {
    fmt.Println("t1i")
}

func testI() {
    var t t1 = &t1i{}
    b, e := json.Marshal(t)
    if e != nil {
        fmt.Println(e)
        return
    }
    var t2 t1

    e = json.Unmarshal(b, &t2)
    if e != nil {
        fmt.Println(e)
    }
}

如上代码, 会有json: cannot unmarshal object into Go value of type main.t1报错,请问接口如何做反序列化


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

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

4687 次点击  
加入收藏 微博
8 回复  |  直到 2021-09-16 10:40:14
15871155532
15871155532 · #1 · 4年之前

要先转换成结构体 t3 := t2.(*t1i)

wuchenghui
wuchenghui · #2 · 4年之前

接口又没有数据,做序列化的意义是什么

harman
harman · #3 · 4年之前

t2是nil,当然无法序列化,首先你要有个实体

focusonline
focusonline · #4 · 4年之前

反序列化必须要基于实体定义, 接口是你反序列化到实体实例之后, 再做转换才行.

lysShub
lysShub · #5 · 4年之前

完全没用写接口的必要,接口只是一个规范

whc9527
whc9527 · #6 · 4年之前

初始化一下 var t2 t1 = &t1i{}

cy422396350
cy422396350 · #7 · 4年之前

1楼说的对

zdf123456
zdf123456 · #8 · 4年之前

你创建的t2是interface类型,这边你可以转换为具体结构体然后做反序列化,了解一下interface具体的一个结构类型你就清楚为啥反序列化失败了

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