栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Golang:嵌套JSON Unmarshaler遇到麻烦

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang:嵌套JSON Unmarshaler遇到麻烦

为什么最后没有结果

这不是解码器中的错误,而是代码中的错误。你只是将另一个地址为本地指针

s
UnmarshalJSON
。更正的代码:

func (s *Somefin) UnmarshalJSON(b []byte) error {    log.Println("Unmarshaling",string(b))    sn := Somefin("~"+string(b)+"~")    *s = sn    return nil}

语义

s = &sn
:将地址分配
&sn
s
。这类似于
s = 42

的语义

*s = sn
:将所有内容复制
sn
到指向的地方
s

这项工作的一项要求是

s
指向有效的内存位置,并且不能为
nil
。您的代码用法示例(播放):

w := &Wat{Somefin: new(Somefin)}err := json.Unmarshal(b,w)log.Printf("%#v (%s)n", w, err)

Crucial是

Wat
使用new进行的初始化,
Somefin
因此
s
in
的指针
UnmarshalJSON
有效(指向使用创建的对象
new(Somefin)
)。

为什么要输入整个字符串
UnmarshalJSON

嵌入不是多态。虽然嵌入对象(在你的情况的方法集

Somefin
)提升到外面,但这 并不 意味着该方法现在工作的嵌入结构,而不是嵌入的一个。

小例子(播放):

type Inner struct { a int }func (i *Inner) A() int { return i.a }type Outer struct {    *Inner    a int}i := &Inner{}o := Outer{Inner: i}fmt.Println("Inner.A():", i.A())fmt.Println("Outer.A():", o.A())o.a = 2fmt.Println("Outer.A():", o.A())

有了多态,您将希望

Outer.A()
返回,
2
因为方法
A()
将在范围内运行,
Outer
并且
Inner
不再运行。嵌入后,作用域
A()
将永远不会改变,并且
将始终在上运行
Inner

相同的效果会阻止您

UnmarshalJSON
看到这两个成员
A
B
因为它们根本不在以下范围内
Somefin

  1. JSON库看到
    UnmarshalJSON
    Wat
    ,因为
    UnmarshalJSON
    Somefin
    被提升到外
  2. JSON库无法在其中找到任何匹配的元素
    Somefin
    并提供整个输入


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506987.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号