我需要一个包含多个类型的抽象切片。最简化的代码是这样:
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中?
谢谢大家!
答案 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{}