亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

Go
慕神8447489 2023-06-01 18:16:54
我正在深入研究 Go 架構,但我遇到了多態性問題。我簡化了問題并為此示例創建了新數據,以便更容易理解我的問題。我有這樣的結構:type Animal interface {? ? speak() string}type Cat struct {? ? Name string}type Dog struct {? ? Race string}我希望結構實現接口,我是這樣進行的:? ?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}所以我創建的是:該方法speak接收一個Animal并執行方法講述給定的結構 ( Animal,即Cator Dog),并且該方法speaks接收一個切片Animal并執行該切片的每個索引中給出的結構的方法 ( Animal,即Cat或Dog)。為了測試這些方法,我實現了這個功能: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}我上傳編譯器給我的錯誤:錯誤_編譯器有人可以向我解釋為什么我可以在只接收一個元素的函數中使用 polimorfish,為什么不能在接收該元素的一部分的函數中使用?我真的需要找到這個問題的解決方案來在我的應用程序的不同部分實現它,我不知道如何解決這個問題,也不知道如何實現一個實用且可擴展的解決方案(實際應用程序中的切片將包含一個高元素的數量)。我發現這個相關的答案對于了解更多我的問題很有用,但我仍然不明白問題是什么或解決方案:?Answer1?Answer2?Answer3
查看完整描述

2 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

Go 不能類型轉換數組。您需要手動創建目標類型的新數組,然后使用 for 循環對源數組的每個元素進行類型轉換,并將結果放入目標數組。

原因:go 不會向你隱藏內存分配,這就是為什么你需要創建新的并手動感受它的原因。

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

TA貢獻1887條經驗 獲得超5個贊

固定版本,在Play

正如其他人所提到的,Go 中沒有自動類型轉換。[]Cat 與 []Animal 完全不同。

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

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

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

它工作正常。

如果你習慣了像 Java 這樣的語言,他們會以一種非常不同的方式來處理這個問題,因為 java 將所有東西都視為一個Object.?因此,當他們添加泛型時,這是一個簡單的編譯時技巧,其中集合實際上只是一個列表Object,編譯器會在提取點插入一個強制轉換。

諸如此類的東西int不是 java 中的對象,這就是為什么您不能創建 a 的原因List<int>,因為這樣List<Object>轉換技巧就不起作用了。因為int不是Object.

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

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

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

今天,由于它不是自動的,您必須編寫代碼來進行轉換。這有你寫更多代碼的缺點。它的好處是系統中正在發生的事情是顯而易見的。


查看完整回答
反對 回復 2023-06-01
  • 2 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號