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

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

只有標(biāo)簽不同的相同結(jié)構(gòu)類(lèi)型之間的不安全轉(zhuǎn)換

只有標(biāo)簽不同的相同結(jié)構(gòu)類(lèi)型之間的不安全轉(zhuǎn)換

Go
慕慕森 2021-11-15 15:32:57
考慮兩種結(jié)構(gòu)相同但標(biāo)簽不同的類(lèi)型:type Foo struct {  Id int64 `json:"-"`}type Bar struct {  Id int64 `json:"id"`}不幸的是,當(dāng)兩種類(lèi)型的標(biāo)簽不同并且有充分的理由時(shí),Go 的習(xí)慣用法禁止在兩種類(lèi)型之間進(jìn)行轉(zhuǎn)換。但是我仍然需要能夠控制序列化為 JSON 并且不想使用interface{}類(lèi)型的數(shù)據(jù)。我的問(wèn)題是,使用 golangunsafe.Pointer在結(jié)構(gòu)相同(但不是標(biāo)簽)的兩種類(lèi)型之間執(zhí)行強(qiáng)制轉(zhuǎn)換有多安全?就像是:rf := &Foo{1}rb := (*Bar)(unsafe.Pointer(rf))是否有任何在所有的恐慌,也許隨之而來(lái)的機(jī)會(huì),因?yàn)閮?nèi)部各兩種類(lèi)型的數(shù)據(jù)被保持略有不同,由于標(biāo)簽的不同或即將標(biāo)簽每種類(lèi)型的與實(shí)際的數(shù)據(jù)類(lèi)型和數(shù)據(jù)分別舉行的信息結(jié)構(gòu)相同嗎?編輯為了澄清起見(jiàn),我應(yīng)該提到,盡管上面提供的示例使用單字段結(jié)構(gòu),但問(wèn)題實(shí)際上是關(guān)于包含多個(gè)字段的結(jié)構(gòu)類(lèi)型。
查看完整描述

2 回答

?
瀟瀟雨雨

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

嚴(yán)格來(lái)說(shuō),這并不安全。原因是規(guī)范的相關(guān)部分沒(méi)有為結(jié)構(gòu)體的內(nèi)存布局提供任何指導(dǎo)。它不保證內(nèi)存中的字段排序、打包或?qū)R。理論上,編譯器可以根據(jù)優(yōu)化信息,決定兩個(gè)看似相同的結(jié)構(gòu)體根據(jù)它們的使用情況以不同的方式表示。這甚至可能是一個(gè) Heisenbug,其中違規(guī)優(yōu)化不會(huì)在go test構(gòu)建中發(fā)生。

實(shí)際上,這在任何真正的編譯器中都不太可能發(fā)生,您可能可以安全地做到這一點(diǎn)。對(duì)于像您提供的字段結(jié)構(gòu)這樣的字段結(jié)構(gòu)尤其如此。不過(guò),在執(zhí)行此操作之前,您可能應(yīng)該通過(guò)分析來(lái)確保復(fù)制是不夠的。


查看完整回答
反對(duì) 回復(fù) 2021-11-15
?
元芳怎么了

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

不幸的是,當(dāng)兩種類(lèi)型的標(biāo)簽不同并且有充分的理由時(shí),Go 的習(xí)慣用法禁止在兩種類(lèi)型之間進(jìn)行轉(zhuǎn)換


Go 1.8(目前處于測(cè)試階段)的發(fā)行說(shuō)明似乎表明此限制現(xiàn)已解除:


語(yǔ)言的變化

當(dāng)將值從一種結(jié)構(gòu)類(lèi)型顯式轉(zhuǎn)換為另一種結(jié)構(gòu)類(lèi)型時(shí),從 Go 1.8 開(kāi)始,這些標(biāo)記將被忽略。

因此,兩個(gè)僅標(biāo)簽不同的結(jié)構(gòu)可以從一個(gè)轉(zhuǎn)換為另一個(gè):


func example() {

    type T1 struct {

        X int `json:"foo"`

    }

    type T2 struct {

        X int `json:"bar"`

    }

    var v1 T1

    var v2 T2

    v1 = T1(v2) // now legal

}


查看完整回答
反對(duì) 回復(fù) 2021-11-15
  • 2 回答
  • 0 關(guān)注
  • 201 瀏覽
慕課專(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)