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

你可能感兴趣的:(新世界杂货铺,golang,go,interface)