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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

Go
慕神8447489 2023-06-01 18:16:54
我正在深入研究 Go 架構(gòu),但我遇到了多態(tài)性問題。我簡(jiǎn)化了問題并為此示例創(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接收一個(gè)Animal并執(zhí)行方法講述給定的結(jié)構(gòu) ( Animal,即Cator Dog),并且該方法speaks接收一個(gè)切片Animal并執(zhí)行該切片的每個(gè)索引中給出的結(jié)構(gòu)的方法 ( Animal,即Cat或Dog)。為了測(cè)試這些方法,我實(shí)現(xiàn)了這個(gè)功能: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}我上傳編譯器給我的錯(cuò)誤:錯(cuò)誤_編譯器有人可以向我解釋為什么我可以在只接收一個(gè)元素的函數(shù)中使用 polimorfish,為什么不能在接收該元素的一部分的函數(shù)中使用?我真的需要找到這個(gè)問題的解決方案來(lái)在我的應(yīng)用程序的不同部分實(shí)現(xiàn)它,我不知道如何解決這個(gè)問題,也不知道如何實(shí)現(xiàn)一個(gè)實(shí)用且可擴(kuò)展的解決方案(實(shí)際應(yīng)用程序中的切片將包含一個(gè)高元素的數(shù)量)。我發(fā)現(xiàn)這個(gè)相關(guān)的答案對(duì)于了解更多我的問題很有用,但我仍然不明白問題是什么或解決方案:?Answer1?Answer2?Answer3
查看完整描述

2 回答

?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

Go 不能類型轉(zhuǎn)換數(shù)組。您需要手動(dòng)創(chuàng)建目標(biāo)類型的新數(shù)組,然后使用 for 循環(huán)對(duì)源數(shù)組的每個(gè)元素進(jìn)行類型轉(zhuǎn)換,并將結(jié)果放入目標(biāo)數(shù)組。

原因:go 不會(huì)向你隱藏內(nèi)存分配,這就是為什么你需要?jiǎng)?chuàng)建新的并手動(dòng)感受它的原因。

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

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊

固定版本,在Play

正如其他人所提到的,Go 中沒有自動(dòng)類型轉(zhuǎn)換。[]Cat 與 []Animal 完全不同。

您真正需要做的就是創(chuàng)建一個(gè)您將傳遞給該方法的類型的切片speaks。
所以,改變:

arrayCats?:=?[]Cat{cat1,?cat2,?cat3}

arrayCats?:=?[]Animal{cat1,?cat2,?cat3}

它工作正常。

如果你習(xí)慣了像 Java 這樣的語(yǔ)言,他們會(huì)以一種非常不同的方式來(lái)處理這個(gè)問題,因?yàn)?java 將所有東西都視為一個(gè)Object.?因此,當(dāng)他們添加泛型時(shí),這是一個(gè)簡(jiǎn)單的編譯時(shí)技巧,其中集合實(shí)際上只是一個(gè)列表Object,編譯器會(huì)在提取點(diǎn)插入一個(gè)強(qiáng)制轉(zhuǎn)換。

諸如此類的東西int不是 java 中的對(duì)象,這就是為什么您不能創(chuàng)建 a 的原因List<int>,因?yàn)檫@樣List<Object>轉(zhuǎn)換技巧就不起作用了。因?yàn)?code>int不是Object.

在 go 中,像 struct 這樣的東西沒有通用的基類型,所以沒有真正的方法來(lái)做 java 做的轉(zhuǎn)換技巧。

正如其他人所提到的,還有一些關(guān)于如何管理內(nèi)存的特定功能使得自動(dòng)轉(zhuǎn)換之類的東西無(wú)法以通用方式工作(即:int64 的一片與 int32 的一片不同的內(nèi)存占用,因此不可轉(zhuǎn)換沒有分配)。

Go 團(tuán)隊(duì)表示他們正在考慮以某種形式添加泛型,這可能會(huì)使這樣的事情更容易編寫。但這將帶來(lái)不可見的運(yùn)行時(shí)或編譯時(shí)復(fù)雜性(或兩者)的成本。

今天,由于它不是自動(dòng)的,您必須編寫代碼來(lái)進(jìn)行轉(zhuǎn)換。這有你寫更多代碼的缺點(diǎn)。它的好處是系統(tǒng)中正在發(fā)生的事情是顯而易見的。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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