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

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