猿问

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

原型函数


func test(i ...interface{}) {

    // Code here

}

有可能的使用


type foo struct {

    // Fields

}


foos := []foo{

    // foo1, foo2 ...

}


test(foos...) // ERROR

test(foos[1], foos[2], ...) // OK

错误

无法使用 foos([]foos 类型的变量)作为要测试的参数中的 []interface{} 值

描述

预期用途是像内置函数一样使用append()

https://golang.google.cn/pkg/builtin/#append

func append(slice []Type, elems ...Type) []Type

虽然,正如我所见,append()不使用interface{},这很奇怪,因为在我搜索的任何地方,所有人都说interface{}当您不知道类型时使用。但他们没有。不,append()使用名为 的“内置”类型Type,显然文档说它是一个int. 虽然,我不能使用它。没有这种类型。如果有的话我也不知道如何使用它。

https://golang.google.cn/pkg/builtin/#Type

type Type int

所以,我在这里很困惑。

问题

  1. 为什么展开运算符不能按预期工作?例如,在 Javascript 中,扩展运算符只是将数组扩展为项目。但在 Golang 中,它似乎保留了相同的数组参数类型,但稍后给编译器提供了传播它的指令。这很奇怪。

  2. 我们是否能够制作类似的自定义机制append()?或者我是一个假人,我无论如何都使用了错误的东西?


牛魔王的故事
浏览 107回答 3
3回答

ABOUTYOU

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

小唯快跑啊

您可以对键入的切片进行类型转换以获得所需的内容:generic := make([]interface{}, 0)for _, f := range foos {  generic = append(generic, f)}test(generic...)  // works

人到中年有点甜

将两个非否定答案结合成我认为最好的解决方案: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
随时随地看视频慕课网APP

相关分类

Go
我要回答