为了账号安全,请及时绑定邮箱和手机立即绑定

如何制作一个接收自定义接口数组的函数

如何制作一个接收自定义接口数组的函数

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 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信