我需要一个包含多个类型的抽象 slice 。最简化的代码是这样的:

package main

import "fmt"

type A interface{}

type X string

func main() {
    sliceA := make([]A, 0, 0)
    sliceX := []X{"x1", "x2"}
    var appendedSlice []A
    appendedSlice = append(sliceA, sliceX[0], sliceX[1])  // (1) works
    appendedSlice = append(sliceA, sliceX...)             // (2) doesn't work
    fmt.Println(appendedSlice)

}

在我的真实程序中,接口(interface)A定义了一些功能,而X和其他类型则实现了它。

第(2)行引发错误cannot use sliceX (type []X) as type []A in append

我以为(2)是(1)的语法糖,但我可能遗漏了某些东西...是否必须始终将元素X逐一添加到 slice A中?

预先谢谢你们!

最佳答案

问题在于interface{}string是两种不同的类型。
要将 slice 从string转换为interface{},您将必须通过以下方式之一进行操作:

创建sliceA并将其大小初始化为sliceX长度

sliceA := make([]A, len(sliceX))
for ix, item := range sliceX {
    sliceA[ix] = item
}

动态将sliceX项附加到appendedSlice
var appendedSlice []A
for ix := range sliceX {
    appendedSlice = append(appendedSlice, sliceX[ix])
}

请在这里阅读更多
Convert []string to []interface{}

10-06 14:28