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

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

具有相同基礎類型的類型轉(zhuǎn)換結(jié)構(gòu)

具有相同基礎類型的類型轉(zhuǎn)換結(jié)構(gòu)

Go
慕運維8079593 2022-08-01 09:24:57
對于基本類型,如果它們的基礎類型相同,我們可以很容易地強制轉(zhuǎn)換類型。但是,具有相同內(nèi)存布局的結(jié)構(gòu)中的字段不能輕松地從一種類型轉(zhuǎn)換為另一種類型。有一個關(guān)于這個問題的建議,不幸的是它被拒絕了。經(jīng)過一個小時的谷歌搜索,沒有運氣,我來到這里尋求專家的幫助。看看下面的例子:package 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盡管結(jié)構(gòu) A 和 B 具有相同的底層類型,為什么我不能像底層類型一樣相互轉(zhuǎn)換。除非基礎類型不同,否則是否可以遞歸強制轉(zhuǎn)換?struct { string,int}Intint
查看完整描述

1 回答

?
慕的地6264312

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

你不能僅僅因為語言規(guī)范不允許這樣做就這樣做。關(guān)于結(jié)構(gòu),如果 Spec: Conversion:

在以下任何一種情況下,非常量值都可以轉(zhuǎn)換為類型:xT

如果您絕對確定結(jié)構(gòu)的內(nèi)存布局是相同的,則可以使用不安全的轉(zhuǎn)換(使用包不安全),如下所示:

var a A = A{"Foo", 21}

var b B


b = *(*B)(unsafe.Pointer(&a))

fmt.Println(a, b)

這將輸出(在Go Playground上嘗試):


{Foo 21} {Foo 21}

但以此為最后的手段。使用你失去編譯時類型安全性和可移植性保證。例如,如果以后您只修改其中一個結(jié)構(gòu),則上述代碼將繼續(xù)編譯,即使它可能不再正確,編譯器將無法通知您。unsafe


查看完整回答
反對 回復 2022-08-01
  • 1 回答
  • 0 關(guān)注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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