为什么最后没有结果
这不是解码器中的错误,而是代码中的错误。你只是将另一个地址为本地指针
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因此
sin
的指针
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:
- JSON库看到
UnmarshalJSON
的Wat
,因为UnmarshalJSON
从Somefin
被提升到外 - JSON库无法在其中找到任何匹配的元素
Somefin
并提供整个输入



