gpt4 book ai didi

go - 如何制作一个接收自定义接口(interface)数组的函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:04 24 4
gpt4 key购买 nike

我正在深入研究 Go 架构,但我遇到了多态性问题。我简化了问题并为此示例创建了新数据,以便更容易理解我的问题。

我有这样的结构:

type Animal interface {
speak() string
}

type Cat struct {
Name string
}

type Dog struct {
Race string
}

我希望结构实现接口(interface),我这样进行:

   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 并执行方法 speak 给定结构(Animal,即 CatDog), speaks 方法接收一个 Animal slice 并执行方法 speak 方法在 slice 的每个索引中给出结构 (Animal,即 CatDog)。

为了测试这些方法,我实现了这个功能:

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
}

我上传编译器给我的错误:

Error_compiler

有人可以向我解释为什么我可以在只接收一个元素的函数中使用 polimorfish,而为什么不能在接收该元素的一部分的函数中使用 polimorfish?

我真的需要找到这个问题的解决方案来在我的应用程序的不同部分实现它,我不知道如何解决这个问题,也不知道如何实现一个实用且可扩展的解决方案(实际应用程序中的 slice 将包含大量元素)。

我发现这个相关的答案对于了解更多我的问题很有用,但我仍然不明白问题是什么或解决方案: Answer1 Answer2 Answer3

最佳答案

Go 不能类型转换数组。您需要手动创建目标类型的新数组,然后使用 for 循环对源数组的每个元素进行类型转换,并将结果放入目标数组。

原因:go 不会向你隐藏内存分配,这就是为什么你需要创建新的并手动感受它的原因。

https://golang.org/doc/faq#convert_slice_of_interface

关于go - 如何制作一个接收自定义接口(interface)数组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54377597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com