1 回答
TA贡献1843条经验 获得超7个赞
这是因为您使用指针Edition.MarshalJSON()接收器声明了该方法:
func (u *Edition) MarshalJSON() ([]byte, error)
并且您尝试编组非指针值(您的地图包含datamodel.Edition值):
var EditionsMap map[string]datamodel.Edition
// ...
json.NewEncoder(w).Encode(EditionsMap)
具有指针接收器的方法不属于相应非指针类型的方法集。类型的方法集datamodel.Edition 不包含方法MarshalJSON()。
规格:方法集:
一个类型可能有一个与之关联的方法集。接口类型的方法集就是它的接口。任何其他类型的方法集由声明为接收者类型T的所有方法T组成。对应指针类型 *T的方法集是所有用receiver *Tor声明的方法的T集合(即它还包含 的方法集T)。
尝试编组指针值,定义您的地图以包含指针:
var EditionsMap map[string]*datamodel.Edition
// ...
if err := json.NewEncoder(w).Encode(EditionsMap); err != nil {
panic(err) // HANDLE error somehow, do not omit it like in your example!
}
指针类型的值*Edition 确实有一个方法,该方法MarshalJSON()将被json包正确调用。在Go Playground上尝试一个可行的示例。
另一种选择是Edition.MarshalJSON()使用值接收器定义方法:
func (u Edition) MarshalJSON() ([]byte, error)
这样,无论您编组指针值还是非指针值,它都可以工作,因为具有值接收器的方法是Edition类型和相应*Edition指针类型的方法集的一部分。在Go Playground上尝试这个变体的工作示例。
- 1 回答
- 0 关注
- 252 浏览
添加回答
举报
