传播时“无法使用 []struct 类型的变量作为 []interface”

Eks*_*psy 6 go slice

原型函数

func test(i ...interface{}) {
    // Code here
}
Run Code Online (Sandbox Code Playgroud)

有可能的使用

type foo struct {
    // Fields
}

foos := []foo{
    // foo1, foo2 ...
}

test(foos...) // ERROR
test(foos[1], foos[2], ...) // OK
Run Code Online (Sandbox Code Playgroud)

错误

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

描述

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

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

func append(slice []Type, elems ...Type) []Type
Run Code Online (Sandbox Code Playgroud)

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

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

type Type int
Run Code Online (Sandbox Code Playgroud)

所以,我在这里很困惑。

问题

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

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

Joh*_*ing 7

我认为这就是您在这里遇到的问题。

https://github.com/golang/go/wiki/InterfaceSlice

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