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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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

2 回答

?
瀟瀟雨雨

TA貢獻1833條經(jīng)驗 獲得超4個贊

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

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


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

TA貢獻1798條經(jīng)驗 獲得超7個贊

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


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


語言的變化

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

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


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

}


查看完整回答
反對 回復(fù) 2021-11-15
  • 2 回答
  • 0 關(guān)注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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