2 回答
TA贡献1856条经验 获得超11个赞
Go 不能类型转换数组。您需要手动创建目标类型的新数组,然后使用 for 循环对源数组的每个元素进行类型转换,并将结果放入目标数组。
原因:go 不会向你隐藏内存分配,这就是为什么你需要创建新的并手动感受它的原因。
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 团队表示他们正在考虑以某种形式添加泛型,这可能会使这样的事情更容易编写。但这将带来不可见的运行时或编译时复杂性(或两者)的成本。
今天,由于它不是自动的,您必须编写代码来进行转换。这有你写更多代码的缺点。它的好处是系统中正在发生的事情是显而易见的。
- 2 回答
- 0 关注
- 93 浏览
添加回答
举报