感觉发现了go变参的bug

dwdcth · 2018-01-18 16:28:03 · 1101 次点击 · 预计阅读时间不到 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-01-18 16:28:03 的文章,其中的信息可能已经有所发展或是发生改变。

代码如下,按照逻辑下面slice解包后应该没问题,可是下面的代码,有两处都报错

package main

func demo1(nums ...interface{}) {
}

func demo2(arg1 int, arg2 ...interface{}) {
}

func main() {
    nums1 := []int{1, 2, 3, 4}
    demo1(nums1)
    demo1(nums1...) //错误

    nums2 := []interface{}{1,2,3,4}
    demo2(1, nums2...)
    demo2(1, nums1...) //错误
    demo1(1, nums2...) //错误
}

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

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

1101 次点击  
加入收藏 微博
9 回复  |  直到 2018-01-18 19:59:24
polaris
polaris · #1 · 7年之前

[]int[]interface{} 是不一样的。相当于你把 []int 参数传给 []interface{},自然报错。

dwdcth
dwdcth · #2 · 7年之前
polarispolaris #1 回复

`[]int` 和 `[]interface{}` 是不一样的。相当于你把 `[]int` 参数传给 `[]interface{}`,自然报错。

但是我解包了啊

polaris
polaris · #3 · 7年之前

跟解不解包没有关系。

nums1 := []int{1, 2, 3, 4} 改为 nums1 := []interface{}{1, 2, 3, 4}

dwdcth
dwdcth · #4 · 7年之前
polarispolaris #3 回复

跟解不解包没有关系。 把 `nums1 := []int{1, 2, 3, 4}` 改为 `nums1 := []interface{}{1, 2, 3, 4}`

我的意思是解包后应该相当于独立的参数了,类似于demo1(1,2,3,4)

dwdcth
dwdcth · #5 · 7年之前
polarispolaris #3 回复

跟解不解包没有关系。 把 `nums1 := []int{1, 2, 3, 4}` 改为 `nums1 := []interface{}{1, 2, 3, 4}`

另外demo1(1,nums2...)也是错的

polaris
polaris · #6 · 7年之前

你可以看看 GCTT 翻译的文章:Go 语言“可变参数函数”终极指南

justay
justay · #7 · 7年之前

demo1里面的nums[]int类型,demo2里的arg2[]interface{}类型

dwdcth
dwdcth · #8 · 7年之前
polarispolaris #6 回复

你可以看看 GCTT 翻译的文章:[Go 语言“可变参数函数”终极指南](/articles/11965)

谢谢,明白了

dwdcth
dwdcth · #9 · 7年之前
justayjustay #7 回复

`demo1`里面的`nums`是`[]int`类型,`demo2`里的`arg2`是`[]interface{}`类型

嗯嗯

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传