原型函数func test(i ...interface{}) { // Code here}有可能的使用type foo struct { // Fields}foos := []foo{ // foo1, foo2 ...}test(foos...) // ERRORtest(foos[1], foos[2], ...) // OK错误无法使用 foos([]foos 类型的变量)作为要测试的参数中的 []interface{} 值描述预期用途是像内置函数一样使用append()。https://golang.google.cn/pkg/builtin/#appendfunc append(slice []Type, elems ...Type) []Type虽然,正如我所见,append()不使用interface{},这很奇怪,因为在我搜索的任何地方,所有人都说interface{}当您不知道类型时使用。但他们没有。不,append()使用名为 的“内置”类型Type,显然文档说它是一个int. 虽然,我不能使用它。没有这种类型。如果有的话我也不知道如何使用它。https://golang.google.cn/pkg/builtin/#Typetype Type int所以,我在这里很困惑。问题为什么展开运算符不能按预期工作?例如,在 Javascript 中,扩展运算符只是将数组扩展为项目。但在 Golang 中,它似乎保留了相同的数组参数类型,但稍后给编译器提供了传播它的指令。这很奇怪。我们是否能够制作类似的自定义机制append()?或者我是一个假人,我无论如何都使用了错误的东西?
3 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
我认为这就是您在这里遇到的问题。
https://github.com/golang/go/wiki/InterfaceSlice
我不是这方面的专家,但之前已经遇到过这个问题,“空接口切片”不是一个接口,因此不能被任何类型替换,这是您遇到的问题,它与内存结构有关不同的。上面的解释比我能给出的解释要好得多。
小唯快跑啊
TA贡献1863条经验 获得超2个赞
您可以对键入的切片进行类型转换以获得所需的内容:
generic := make([]interface{}, 0)
for _, f := range foos {
generic = append(generic, f)
}
test(generic...) // works
人到中年有点甜
TA贡献1895条经验 获得超7个赞
将两个非否定答案结合成我认为最好的解决方案:
interfaceSlice := make([]interface{}, len(foos))
for i, v := range foos {
interfaceSlice[i] = v
}
test(interfaceSlice...)
部分灵感来自:
https://github.com/golang/go/wiki/InterfaceSlice#what-can-i-do-instead
- 3 回答
- 0 关注
- 106 浏览
添加回答
举报
0/150
提交
取消