append()中的“ ...”符号不适用于追加不同类型的切片

时间:2018-10-30 07:52:48

标签: go

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

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)

}

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

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

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

谢谢大家!

1 个答案:

答案 0 :(得分:5)

问题在于interface{}string是两种不同的类型。 要将切片从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{}