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

新世界杂货铺 · · 744 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:新世界杂货铺

查看原文:int切片和string切片为什么不能转为interface类型的切片

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

744 次点击  
加入收藏 微博
1 回复  |  直到 2020-08-25 18:19:03
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传