int切片和string切片为什么不能转为interface类型的切片

在给可变参数传参时, 笔者经常会犯一些低级错误。如:
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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。