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

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

json.NewEncoder 和 json.NewDecoder 中的序列化/編碼

json.NewEncoder 和 json.NewDecoder 中的序列化/編碼

Go
UYOU 2022-06-27 09:20:18
我正在嘗試通過(guò)在 Go 中使用 gorilla mux 庫(kù)構(gòu)建一個(gè)不同的基本 REST API 來(lái)學(xué)習(xí)后端開(kāi)發(fā)(遵循本教程)這是我到目前為止構(gòu)建的代碼:package mainimport ("encoding/json""net/http""github.com/gorilla/mux")// Post represents single post by usertype Post struct {Title  string `json:"title"`Body   string `json:"body"`Author User   `json:"author"`}// User is struct that represnets a usertype User struct {FullName string `json:"fullName"`Username string `json:"username"`Email    string `json:"email"`}var posts []Post = []Post{}func main() {   router := mux.NewRouter()   router.HandleFunc("/posts", addItem).Methods("POST")   http.ListenAndServe(":5000", router)}func addItem(w http.ResponseWriter, req *http.Request) {   var newPost Post   json.NewDecoder(req.Body).Decode(&newPost)   posts = append(posts, newPost)   w.Header().Set("Content-Type", "application/json")   json.NewEncoder(w).Encode(posts)}但是,我真的很困惑到底發(fā)生了json.NewDecoder什么json.NewEncoder。據(jù)我了解,最終以 REST API 通過(guò) Internet 傳輸?shù)臄?shù)據(jù)將以字節(jié)/二進(jìn)制格式(我猜是 UTF-8 編碼?)的形式發(fā)生。json.NewEncoder將 Go 數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為 JSON 字符串也是如此,并且json.NewDecoder正在做相反的事情(如果我錯(cuò)了,請(qǐng)糾正我)。那么這里誰(shuí)負(fù)責(zé)將這個(gè) JSON 字符串轉(zhuǎn)換為 UTF-8 編碼進(jìn)行數(shù)據(jù)傳輸呢?這也是做什么json.NewDecoder和json.NewEncoder 做什么的一部分嗎?此外,如果這兩個(gè)函數(shù)只是對(duì) JSON 進(jìn)行序列化/反序列化,那么為什么要命名編碼器和解碼器(編碼不是總是與二進(jìn)制數(shù)據(jù)轉(zhuǎn)換相關(guān)嗎?)。老實(shí)說(shuō),我對(duì)這些術(shù)語(yǔ)encoding以及它們之間的區(qū)別感到很困惑serializationmarshaling有人能解釋一下每個(gè)轉(zhuǎn)換級(jí)別(json、二進(jìn)制、內(nèi)存數(shù)據(jù)結(jié)構(gòu))的數(shù)據(jù)傳輸?shù)降资侨绾伟l(fā)生的嗎?
查看完整描述

2 回答

?
阿波羅的戰(zhàn)車(chē)

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ò)程。


查看完整回答
反對(duì) 回復(fù) 2022-06-27
?
達(dá)令說(shuō)

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊

  1. 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ù)組。)

  2. Go 使用術(shù)語(yǔ)編碼進(jìn)行序列化和解碼用于反序列化,無(wú)論序列化形式是二進(jìn)制形式還是文本形式。不要過(guò)多考慮術(shù)語(yǔ)——將encodeseralise視為同義詞。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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