第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

MarshalJSON 未調(diào)用

MarshalJSON 未調(diào)用

Go
牛魔王的故事 2022-03-03 16:31:51
我正在嘗試MarshalJSON使用界面自定義 的輸出:func (m *RawMessage) MarshalJSON() ([]byte, error)我按照那個(gè)教程:http ://choly.ca/post/go-json-marshalling/我的目的是刪除用真/假(如果設(shè)置與否)替換其中一個(gè)字段,所以我最終編寫了該函數(shù):func (u *Edition) MarshalJSON() ([]byte, error) {    var vaultValue bool    vaultValue = true    var onlineValue bool    vaultValue = false    fmt.Println("here")    if u.Vault == nil {        vaultValue = false    }    if u.Online == nil {        onlineValue = false    }    type AliasEdition Edition    return json.Marshal(&struct {        Vault  bool `json:"vault,omitempty"`        Online bool `json:"online,omitempty"`        *AliasEdition    }{        Vault:        vaultValue,        Online:       onlineValue,        AliasEdition: (*Alias)(u),    })}JSON 是使用以下指令從地圖創(chuàng)建的:json.NewEncoder(w).Encode(EditionsMap)顯然EditionsMap是Editions 結(jié)構(gòu)的 Map:var EditionsMap map[string]datamodel.Edition問(wèn)題是該MarshalJSON函數(shù)顯然從未被調(diào)用過(guò)。可能我做錯(cuò)了什么,但我不明白問(wèn)題出在哪里,我的理解是我只需要實(shí)現(xiàn)那個(gè)函數(shù)就可以調(diào)用它。
查看完整描述

1 回答

?
藍(lán)山帝景

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è)變體的工作示例。


查看完整回答
反對(duì) 回復(fù) 2022-03-03
  • 1 回答
  • 0 關(guān)注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)