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

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

如何制作一個接收自定義接口數(shù)組的函數(shù)

如何制作一個接收自定義接口數(shù)組的函數(shù)

Go
慕神8447489 2023-06-01 18:16:54
我正在深入研究 Go 架構(gòu),但我遇到了多態(tài)性問題。我簡化了問題并為此示例創(chuàng)建了新數(shù)據(jù),以便更容易理解我的問題。我有這樣的結(jié)構(gòu):type Animal interface {? ? speak() string}type Cat struct {? ? Name string}type Dog struct {? ? Race string}我希望結(jié)構(gòu)實(shí)現(xiàn)接口,我是這樣進(jìn)行的:? ?func (c Cat) speak() string {? ? return "Miaw!"}func (d Dog) speak() string {? ? return "Guau!"}func speak(a Animal) string {? ? return a.speak()}func speaks(a []Animal) string {? ? str := ""? ? for i := 0; i < len(a); i++ {? ? ? ? str += a[i].speak()? ? }? ? return str}所以我創(chuàng)建的是:該方法speak接收一個Animal并執(zhí)行方法講述給定的結(jié)構(gòu) ( Animal,即Cator Dog),并且該方法speaks接收一個切片Animal并執(zhí)行該切片的每個索引中給出的結(jié)構(gòu)的方法 ( Animal,即Cat或Dog)。為了測試這些方法,我實(shí)現(xiàn)了這個功能:func test()? {? ? cat1 := Cat{? ? ? ? Name: "Cat1",? ? }? ? cat2 := Cat{? ? ? ? Name: "Cat2",? ? }? ? cat3 := Cat{? ? ? ? Name: "Cat3",? ? }? ? arrayCats := []Cat{cat1, cat2, cat3}? ? speak(cat1)? ? speak(cat3)? ? speak(cat2)? ? speaks(arrayCats) //This line gives an error to the Compiler}我上傳編譯器給我的錯誤:錯誤_編譯器有人可以向我解釋為什么我可以在只接收一個元素的函數(shù)中使用 polimorfish,為什么不能在接收該元素的一部分的函數(shù)中使用?我真的需要找到這個問題的解決方案來在我的應(yīng)用程序的不同部分實(shí)現(xiàn)它,我不知道如何解決這個問題,也不知道如何實(shí)現(xiàn)一個實(shí)用且可擴(kuò)展的解決方案(實(shí)際應(yīng)用程序中的切片將包含一個高元素的數(shù)量)。我發(fā)現(xiàn)這個相關(guān)的答案對于了解更多我的問題很有用,但我仍然不明白問題是什么或解決方案:?Answer1?Answer2?Answer3
查看完整描述

2 回答

?
呼喚遠(yuǎn)方

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)建新的并手動感受它的原因。

查看完整回答
反對 回復(fù) 2023-06-01
?
慕工程0101907

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ā)生的事情是顯而易見的。


查看完整回答
反對 回復(fù) 2023-06-01
  • 2 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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