2 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個贊
Go 不能類型轉(zhuǎn)換數(shù)組。您需要手動創(chuàng)建目標(biāo)類型的新數(shù)組,然后使用 for 循環(huán)對源數(shù)組的每個元素進(jìn)行類型轉(zhuǎn)換,并將結(jié)果放入目標(biāo)數(shù)組。
原因:go 不會向你隱藏內(nèi)存分配,這就是為什么你需要創(chuàng)建新的并手動感受它的原因。

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個贊
固定版本,在Play
正如其他人所提到的,Go 中沒有自動類型轉(zhuǎn)換。[]Cat 與 []Animal 完全不同。
您真正需要做的就是創(chuàng)建一個您將傳遞給該方法的類型的切片speaks
。
所以,改變:
arrayCats?:=?[]Cat{cat1,?cat2,?cat3}
到
arrayCats?:=?[]Animal{cat1,?cat2,?cat3}
它工作正常。
如果你習(xí)慣了像 Java 這樣的語言,他們會以一種非常不同的方式來處理這個問題,因?yàn)?java 將所有東西都視為一個Object
.?因此,當(dāng)他們添加泛型時,這是一個簡單的編譯時技巧,其中集合實(shí)際上只是一個列表Object
,編譯器會在提取點(diǎn)插入一個強(qiáng)制轉(zhuǎn)換。
諸如此類的東西int
不是 java 中的對象,這就是為什么您不能創(chuàng)建 a 的原因List<int>
,因?yàn)檫@樣List<Object>
轉(zhuǎn)換技巧就不起作用了。因?yàn)?code>int不是Object
.
在 go 中,像 struct 這樣的東西沒有通用的基類型,所以沒有真正的方法來做 java 做的轉(zhuǎn)換技巧。
正如其他人所提到的,還有一些關(guān)于如何管理內(nèi)存的特定功能使得自動轉(zhuǎn)換之類的東西無法以通用方式工作(即:int64 的一片與 int32 的一片不同的內(nèi)存占用,因此不可轉(zhuǎn)換沒有分配)。
Go 團(tuán)隊表示他們正在考慮以某種形式添加泛型,這可能會使這樣的事情更容易編寫。但這將帶來不可見的運(yùn)行時或編譯時復(fù)雜性(或兩者)的成本。
今天,由于它不是自動的,您必須編寫代碼來進(jìn)行轉(zhuǎn)換。這有你寫更多代碼的缺點(diǎn)。它的好處是系統(tǒng)中正在發(fā)生的事情是顯而易見的。
- 2 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報