可变参数引起的思考

liangjfblue · 2018-09-15 11:26:51 · 905 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-09-15 11:26:51 的主题,其中的信息可能已经有所发展或是发生改变。

package test

import (
    "fmt"
    "reflect"
    "testing"
)

func fun(val ...int) {
    fmt.Println(reflect.TypeOf(val))
}

func TestTime(t *testing.T) {
    for i := 0; i < 100000; i++ {
        //fun(1, 2, 3)            //(1)
        //fun([]int{1, 2, 3}...)        //(2)
    }
}

(1)耗时:

(2)耗时:

可变参数,都是以切片复制的形式来传递的, 因为切换的数据结构(指针, 长度, 容量). 一开始, 我以为是(1)更耗时的, 因为要把单一类型一个个组装成切片, (2)就是切片, 不用组装. 但是结果表明是(2)更耗时....

其中肯定发生了什么转换, 那请问大神究竟是发生了什么呢?


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

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

905 次点击  
加入收藏 微博
2 回复  |  直到 2018-09-17 19:48:21
jthmath
jthmath · #1 · 7年之前
polaris
polaris · #2 · 7年之前

我猜二的关键在于 ...,做了一些事情吧,具体没了解这块的实现。

liangjfblue
liangjfblue · #3 · 7年之前
polarispolaris #2 回复

我猜二的关键在于 `...`,做了一些事情吧,具体没了解这块的实现。

看书提到, 切片会打散再逐个放进去做参数, 多了打散操作?

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