在encoding/json中,我添加了一个测试:
func TestUnmarshalCase(t *testing.T) {
var v struct {
Dist string `json:"dist"`
}
Unmarshal([]byte(`{"dist": "ok", "Dist": "KO"}`), &v)
t.Logf("%+v", v)
Unmarshal([]byte(`{"Dist": "ok", "dist": "KO"}`), &v)
t.Logf("%+v", v)
}
打印
x_test.go:13: {Dist:KO}
x_test.go:16: {Dist:KO}
注解说"优先选择"精确匹配,但是如果有多个字段匹配,却没有说明会发生什么。这是一个奇怪的情况,但清晰度会很好。我原本以为精确匹配总是会获胜。
5条答案
按热度按时间ki1q1bka1#
/cc @rsc@mvdan
4jb9z9bj2#
我非常清楚这个问题,遗憾的是。请参阅 #14750 ,这个问题可能是一个重复的问题。我在不产生性能或内存成本的情况下尝试修复这个问题的方法是 https://go-review.googlesource.com/c/go/+/224079 ,它已经陷入了一段时间的审查僵局:)
eyh26e7m3#
这个问题的核心在于我们是否希望优先进行流式解码,还是为了执行精确匹配而缓存JSON对象的所有成员。前者具有显著更好的性能,而后者可能更符合用户的期望。
j8yoct9x4#
请在此处ping一下。看起来这在1.17版本中也无法使用。
@mvdan 看起来PR已经准备好了,有一个问题是1%的性能是否可以接受,对吗?
watbbzwu5#
PR尚未准备好,存在冲突,而且Joe提出的一些边缘情况需要额外的工作。