對于基本類型,如果它們的基礎類型相同,我們可以很容易地強制轉換類型。但是,具有相同內(nèi)存布局的結構中的字段不能輕松地從一種類型轉換為另一種類型。有一個關于這個問題的建議,不幸的是它被拒絕了。經(jīng)過一個小時的谷歌搜索,沒有運氣,我來到這里尋求專家的幫助??纯聪旅娴睦樱簆ackage mainimport ( "fmt")type Int inttype A struct { name string age Int}type B struct { name string age int}func main() { var a A= A{"Foo",21} var b B= B{"Bar", 21} fmt.Println(a,b,(A)(b)) //Error here as expected}even盡管結構 A 和 B 具有相同的底層類型,為什么我不能像底層類型一樣相互轉換。除非基礎類型不同,否則是否可以遞歸強制轉換?struct { string,int}Intint
1 回答

蠱毒傳說
TA貢獻1895條經(jīng)驗 獲得超3個贊
你不能僅僅因為語言規(guī)范不允許這樣做就這樣做。關于結構,如果 Spec: Conversion:
在以下任何一種情況下,非常量值都可以轉換為類型:xT
...
忽略結構標記(見下文),的類型并具有相同的基礎類型。xT
如果您絕對確定結構的內(nèi)存布局是相同的,則可以使用不安全的轉換(使用包不安全),如下所示:
var a A = A{"Foo", 21}
var b B
b = *(*B)(unsafe.Pointer(&a))
fmt.Println(a, b)
這將輸出(在Go Playground上嘗試):
{Foo 21} {Foo 21}
但以此為最后的手段。使用你失去編譯時類型安全性和可移植性保證。例如,如果以后您只修改其中一個結構,則上述代碼將繼續(xù)編譯,即使它可能不再正確,編譯器將無法通知您。unsafe
- 1 回答
- 0 關注
- 101 瀏覽
添加回答
舉報
0/150
提交
取消