Golang可变参数

作者: 董泽润 | 来源:发表于2016-01-24 00:13 被阅读4851次

前天同事提起了一个例子,关于 Golang 中可变参数的使用,平时使用时没有注意这个细节,先上代码吧。

测试代码

想要实现的代码逻辑很明了

1. TestArgs 接受一个 int 参数,一个不定长的参数,并且类型为 interface{}

2. nums 做为 slice,使用 ... 语法糖打散后传入 TestArgs

看上去逻辑没问题,执行报错

# command-line-arguments

./test.go:13: cannot use nums (type []int64) as type []interface {} in argument to TestArgs

居然报类型不匹配,写 Go 也一年了,这块的认知太不到位,一直认为会将 nums 打散,再以 interface{} 这个通用类型组成 interface{} slice 传到 TestArgs。

那么,我们看看到底 nums 传进去后是什么:

slice

再执行后输出 []interface {},那么确认是把可变参数当做 slice 传给函数,这点和 python 很像。那我们再看看 slice 是不是同一个

取地址

执行后输出如下

main addr of slice 0xc82000c0c0

TestArgs addr of slice 0xc82000c0c0

地址相同,原来如果传入的可变参数本身就是由 slice 以 ... 形式传入的,那么就直接使用这个 slice,不会新建 slice。那么我理解的 Go 的可变参数执行方式:

对于 func(first int, arg ...T)

1. 当不传可变参数时,对应的 arg 就是 nil

2. 传入单个可变参数时,实际上执行 [] T{arg1,arg2,arg3}

3. 传入...语法糖的 slice时,直接使用这个 slice

由此我们就很好理解开篇的小例子为什么执行不了,[]int64 和 []interface{} 是两个类型的 slice 。

相关文章

  • Golang 系列教程 第 12 部分,可变参数函数

    欢迎来到 Golang 系列教程 第 12 部分 什么是可变参数函数 可变参数函数是一种参数个数可变的函数。 语法...

  • Golang可变参数

    前天同事提起了一个例子,关于 Golang 中可变参数的使用,平时使用时没有注意这个细节,先上代码吧。 想要实现的...

  • Go教程第九篇:可变参数函数

    可变参数函数 欢迎来到《Golang系列教程》的第九篇文章---可变参数函数。 什么是可变参数函数 ? 通常情况下...

  • Golang学习笔记-1.13 可变参数函数

    本文系第十三篇Golang语言学习教程 可变参数函数 参数数量可变的函数,称为可变参数函数。最典型的例子就是fmt...

  • web编程错题一期

    复制代码时候注意可变的参数。 Golang读取redis map某字段的时候是一个数组。

  • 元组、字典可变参数

    可变参数 需求: 参数数量不确定,能否接收? args元组可变参数 kwargs字典可变参数 传递可变参数

  • 函数参数

    1、可变参数,参数个数可变 在参数前面加上* 就代表可变参数 可变参数,在函数内部其实就是一个tuple def ...

  • Golang的语法糖

    Golang的语法糖 ... Go语言函数中有三个点 ... 表示为可变参数,这是Go的糖衣语法,表示可以接受任...

  • ★10.关于可变参数模板

    可变参数函数模板 可变参数类模板 可变参数函数模板的使用 转发参数包

  • 函数的,参数,变量作用域,递归,匿名函数

    一:函数参数的介绍 1:可变和不可变参数 1.1:必选参数 1.2:默认参数 1.3:可变参数 1.4:关键字参数...

网友评论

  • 53adc7c17c71:```
    package main

    import "fmt"

    func main() {
    args := []interface{}{1, 2, 3, 4}
    foo(args...)
    foo(1, args)
    foo(1, args...)
    }

    func foo(args ...interface{}) {
    fmt.Println(args)
    }

    ```

本文标题:Golang可变参数

本文链接:https://www.haomeiwen.com/subject/eourkttx.html