1 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是因?yàn)槟褂弥羔楨dition.MarshalJSON()接收器聲明了該方法:
func (u *Edition) MarshalJSON() ([]byte, error)
并且您嘗試編組非指針值(您的地圖包含datamodel.Edition值):
var EditionsMap map[string]datamodel.Edition
// ...
json.NewEncoder(w).Encode(EditionsMap)
具有指針接收器的方法不屬于相應(yīng)非指針類型的方法集。類型的方法集datamodel.Edition 不包含方法MarshalJSON()。
規(guī)格:方法集:
一個(gè)類型可能有一個(gè)與之關(guān)聯(lián)的方法集。接口類型的方法集就是它的接口。任何其他類型的方法集由聲明為接收者類型T的所有方法T組成。對(duì)應(yīng)指針類型 *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 確實(shí)有一個(gè)方法,該方法MarshalJSON()將被json包正確調(diào)用。在Go Playground上嘗試一個(gè)可行的示例。
另一種選擇是Edition.MarshalJSON()使用值接收器定義方法:
func (u Edition) MarshalJSON() ([]byte, error)
這樣,無(wú)論您編組指針值還是非指針值,它都可以工作,因?yàn)榫哂兄到邮掌鞯姆椒ㄊ荅dition類型和相應(yīng)*Edition指針類型的方法集的一部分。在Go Playground上嘗試這個(gè)變體的工作示例。
- 1 回答
- 0 關(guān)注
- 198 瀏覽
添加回答
舉報(bào)