在给可变参数传参时, 笔者经常会犯一些低级错误。如:
cannot use (type []string) as type []interface {}
和cannot use (type []int) as type []interface {}
等。所以, 特地写下这篇文章用来时时刻刻地提醒自己。
Q1: 可以将[]T转为[]interface{}类型嘛?
答:不能直接转,Go语言规范不允许这样做,因为两种类型在内存中没有相同的表现形式。有必要将元素单独复制到目标切片。下面的例子将一个[]int转换为[]interface{}:
t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
s[i] = v
}
Q2: 如果T1和T2具有相同的基础类型,可以将[]T1转换为[]T2嘛?
具体列子如下:
type T1 int
type T2 int
var t1 T1
var x = T2(t1) // OK
var st1 []T1
var sx = ([]T2)(st1) // NOT OK
答:在Go中,类型与方法密切相关,每一个命名类型都有一个(可能是空的)方法集。一般规则是,可以更改要转换的类型的名称(从而可以更改其方法集),但不能更改复合类型的元素的名称(和方法集)。Go要求您明确说明类型转换。
注:上述内容翻译自https://golang.org/doc/faq#convert_slice_of_interface