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ù)制是不夠的。

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
}
- 2 回答
- 0 關(guān)注
- 201 瀏覽
添加回答
舉報(bào)