2 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先,我們必須了解編碼過(guò)程實(shí)際上并不意味著它會(huì)翻譯types
并返回 a 的 JSON 表示type
。為您提供 JSON 表示的過(guò)程稱(chēng)為編組過(guò)程,可以通過(guò)調(diào)用json.Marshal 函數(shù)來(lái)完成。
另一方面,Encoding過(guò)程意味著我們想要獲取 any 的 JSON 編碼type
并將其寫(xiě)入(編碼)到實(shí)現(xiàn) io.Writer 接口的流上。正如我們所見(jiàn),func NewEncoder(w io.Writer) *Encoder
接收一個(gè)io.Writer
接口作為參數(shù)并返回一個(gè)*json.Encoder
對(duì)象。調(diào)用該方法時(shí)encoder.Encode()
,它會(huì)執(zhí)行 Marshaling 過(guò)程,然后將結(jié)果寫(xiě)入我們?cè)趧?chuàng)建新 Encoder 對(duì)象時(shí)傳遞的 io.Writer 中。你可以在這里看到 json.Encoder.Encode() 的實(shí)現(xiàn)。
所以,如果你問(wèn)是誰(shuí)對(duì) http 流進(jìn)行編碼處理,答案是http.ResponseWriter
. ResponseWriter 實(shí)現(xiàn)了 io.Writer 接口,在Encode()
調(diào)用該方法時(shí),編碼器會(huì)將對(duì)象編組為 JSON 編碼表示,然后調(diào)用func Write([]byte) (int, error)
io.Writer 接口的一個(gè)契約方法,它會(huì)對(duì)http 流。
總之,我可以說(shuō) Marshal 和 Unmarshal 意味著我們想要獲得任何類(lèi)型的 JSON 表示,反之亦然。而編碼意味著我們要進(jìn)行編組處理,然后將結(jié)果寫(xiě)入(編碼)到任何流對(duì)象。而解碼意味著我們想要從任何流中獲?。ń獯a)一個(gè) json 對(duì)象,然后執(zhí)行 Unmarshaling 過(guò)程。

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
json.Encoder
調(diào)用產(chǎn)生的json.NewEncoder
直接以 UTF-8 產(chǎn)生其輸出。無(wú)需轉(zhuǎn)換。(事實(shí)上,Go 沒(méi)有與 UTF-8 編碼的字節(jié)序列不同的文本數(shù)據(jù)表示形式——即使 astring
只是底層的不可變字節(jié)數(shù)組。)Go 使用術(shù)語(yǔ)編碼進(jìn)行序列化和解碼用于反序列化,無(wú)論序列化形式是二進(jìn)制形式還是文本形式。不要過(guò)多考慮術(shù)語(yǔ)——將encode和seralise視為同義詞。
- 2 回答
- 0 關(guān)注
- 856 瀏覽
添加回答
舉報(bào)