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

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

基于對(duì)象何時(shí)轉(zhuǎn)換為指針(有時(shí)是指針,有時(shí)是映射)更改解組功能

基于對(duì)象何時(shí)轉(zhuǎn)換為指針(有時(shí)是指針,有時(shí)是映射)更改解組功能

Go
小唯快跑啊 2023-06-01 15:01:35
我正在實(shí)現(xiàn)一些序列化對(duì)象的方法(標(biāo)準(zhǔn)庫(kù)中可能已經(jīng)存在,但我想要體驗(yàn))。我能夠讓 json.Marshal 和 json.Unmarshal 正確地將我的數(shù)據(jù)轉(zhuǎn)換為字符串,然后讀回一個(gè)對(duì)象,但我注意到一些我想更好地理解的有趣行為。為了測(cè)試 json 包的功能,我創(chuàng)建了一個(gè)測(cè)試結(jié)構(gòu):type Test struct{    T int    S string    F float32}跑步o := Test{32, "struct", 12.07}b, e := json.Marshal(o)fmt.Println(string(b), e)印刷{"T":32,"S":"struct","F":12.07} <nil>這是我所期望的。但是,在解組時(shí)我能夠得到兩個(gè)不同的結(jié)果,具體取決于我何時(shí)將對(duì)象轉(zhuǎn)換為指針:// Test 1var o2 interface{} = &oe = json.Unmarshal(b, o2)fmt.Println(o2, e)印刷// Output 1&{32 struct 12.07} <nil>同時(shí)將 o2 定義為值而不是指針,然后使用 &o2 調(diào)用 Unmarshal,即。// Test 2var o2 interface{} = oe = json.Unmarshal(b, &o2)fmt.Println(o2, e)印刷// Output 2map[T:32 S:struct F:12.07] <nil>有趣的是,所有四個(gè)// Test 3var o2 Test = oe = json.Unmarshal(b, &o2)fmt.Println(o2, e),// Test 4var o2 *Test = &oe = json.Unmarshal(b, &o2)fmt.Println(*o2, e),// Test 5var o2 *Test = &oe = json.Unmarshal(b, o2)fmt.Println(o2, e), 和// Test 6var o2 *Test = &oe = json.Unmarshal(b, &o2)fmt.Println(o2, e)打印以下內(nèi)容之一:// Output 3, 4{32 struct 12.07} <nil>// Output 5, 6&{32 struct 12.07} <nil>測(cè)試 1 和 2 讓我相信,當(dāng)將某些東西分配給“超類”時(shí),一些運(yùn)行時(shí)信息會(huì)丟失......似乎將指向我的結(jié)構(gòu)的指針?lè)峙浣o o2 為 Unmarshal 函數(shù)提供了更多關(guān)于它應(yīng)該讀取的內(nèi)容的類型數(shù)據(jù)而不是將我的結(jié)構(gòu)分配給 o2,然后將指向 o2 的指針傳遞給 Unmarshal。這有點(diǎn)道理;在編譯時(shí),測(cè)試 1 將 interface{} 傳遞給 Unmarshal,而 Test 2 將指針傳遞給 interface{}。即便如此,我還是認(rèn)為參數(shù)的運(yùn)行時(shí)類型會(huì)是相同的(*測(cè)試)。有人可以解釋為什么 Go 會(huì)這樣工作嗎?支持我的結(jié)論的事實(shí)是,將 o2 聲明為 Test 或 *Test 允許 Unmarshal(因此接收 *Test 作為其參數(shù))始終將我的數(shù)據(jù)讀取為結(jié)構(gòu)而不是映射。奇怪的是,測(cè)試 4 和測(cè)試 6 表明將指針傳遞給指向我的結(jié)構(gòu)的指針是完全可以接受的,并且 Unmarshal 正確(?)設(shè)置了結(jié)構(gòu)的值。我本以為這些測(cè)試會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤,因?yàn)?Unmarshal 應(yīng)該嘗試取消引用雙指針并將結(jié)果指針設(shè)置為它正在讀取的序列化結(jié)構(gòu)。Automatic multi-pointer dereferencing 可能只是這個(gè)功能的一個(gè)特性,但在官方文檔中并沒(méi)有提到。我不太關(guān)心后面的這些測(cè)試。我主要只對(duì)導(dǎo)致測(cè)試 1 和測(cè)試 2 之間的差異的原因感興趣。
查看完整描述

1 回答

?
慕容3067478

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

unmarshal 函數(shù)遍歷指針和包含指針值的接口以找到目標(biāo)值。接口中的非指針值將被忽略,因?yàn)檫@些值不可尋址。(此描述省略了對(duì)問(wèn)題不重要的細(xì)節(jié))。

如果目標(biāo)是 aninterface{}并且 JSON 是對(duì)象,則 JSON 被解組為 amap[string]interface{}并將該值存儲(chǔ)在接口中。

測(cè)試 1:解組的參數(shù)是*Test。unmarshal 函數(shù)遍歷指針并解碼為Test結(jié)構(gòu)。

測(cè)試 2:unmarshal 的參數(shù)是指向interface{}包含Test.?unmarshal 函數(shù)遍歷指針以獲取interface{}.?Test中的值被interface{}忽略,因?yàn)樗豢蓪ぶ?。因?yàn)槟繕?biāo)是 aninterface{}而 JSON 是對(duì)象,所以 JSON 被解碼為map[string]interface{}.

3、4、5 和 6 中的代碼無(wú)法編譯。假設(shè)刪除了{}以下內(nèi)容,我將繼續(xù)Test。

var o2 Test = o // 3

var o2 *Test = &o // 4

var o2 *Test = &o // 5

var o2 *Test = &o // 6

測(cè)試 3 和 5:unmarshal 的參數(shù)是一個(gè)*Test.?這與#1 相同。

測(cè)試 4 和 6:參數(shù)是一個(gè)**Test.?unmarshal 函數(shù)遍歷指針并解碼到Test結(jié)構(gòu)。

因?yàn)?Go 沒(méi)有任何類似“超類”的東西,所以這不是問(wèn)題。


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

添加回答

舉報(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)