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

传播[重复]时“无法使用[]结构类型的变量作为[]接口”

传播[重复]时“无法使用[]结构类型的变量作为[]接口”

Go
牛魔王的故事 2023-07-17 16:34:03
原型函数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

我不是这方面的专家,但之前已经遇到过这个问题,“空接口切片”不是一个接口,因此不能被任何类型替换,这是您遇到的问题,它与内存结构有关不同的。上面的解释比我能给出的解释要好得多。


查看完整回答
反对 回复 2023-07-17
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您可以对键入的切片进行类型转换以获得所需的内容:


generic := make([]interface{}, 0)

for _, f := range foos {

  generic = append(generic, f)

}

test(generic...)  // works


查看完整回答
反对 回复 2023-07-17
?
人到中年有点甜

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


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

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