Golang教程:(十二)变参函数
2018-02-06 11:40
274 查看
这是本Golang系列教程的第十二篇。
变参函数是指可以接受可变数量的参数的函数。
如果一个函数的最后一个参数由
请注意只有函数的最后一个参数才能指定为可变参数。
你有没有想过为什么 append 函数可以将任意数量的值追加到切片末尾?这是因为它是一个变参函数。
让我们来创建一个自己的变参函数。我们将编写一个程序来判断某个特定整数是否包含在某个整数列表中。
上面的程序中,
第 10 行利用 range for 遍历
上面的程序输出如下:
在第 25 行,
nil 切片),在这里
我们已经提到
在第 23 行,我们没有将若干数量的参数传递给
这里有一个语法糖可以用来将切片传递给变参函数。可以在切片后面加
上面的程序如果将第23行的
什么是变参函数?
变参函数是指可以接受可变数量的参数的函数。
语法
如果一个函数的最后一个参数由 ...T表示,则表示该函数可以接受任意数量的类型为
T的参数。
请注意只有函数的最后一个参数才能指定为可变参数。
例子
你有没有想过为什么 append 函数可以将任意数量的值追加到切片末尾?这是因为它是一个变参函数。append的原型为
func append(slice []Type, elems ...Type) []Type,其中
elems是一个可变参数。
让我们来创建一个自己的变参函数。我们将编写一个程序来判断某个特定整数是否包含在某个整数列表中。
package main import ( "fmt" ) func find(num int, nums ...int) { fmt.Printf("type of nums is %T\n", nums) found := false for i, v := range nums { if v == num { fmt.Println(num, "found at index", i, "in", nums) found = true } } if !found { fmt.Println(num, "not found in ", nums) } fmt.Printf("\n") } func main() { find(89, 89, 90, 95) find(45, 56, 67, 45, 90, 109) find(78, 38, 56, 98) find(87) }
上面的程序中,
func find(num int, nums ...int)可以接受任意数量的参数。
...int在内部表示为切片。在这里
nums的类型为
[]int。
第 10 行利用 range for 遍历
nums切片,如果找到
num则打印
num所在位置,否则打印没有找到。
上面的程序输出如下:
type of nums is []int 89 found at index 0 in [89 90 95] type of nums is []int 45 found at index 2 in [56 67 45 90 109] type of nums is []int 78 not found in [38 56 98] type of nums is []int 87 not found in []
在第 25 行,
find只有一个参数。我们没有传递任何参数给
nums ...int。这是合法的,(译者注:如果没有给可变参数传递任何值,则可变参数为
nil 切片),在这里
nums是一个
nil切片,长度和容量都是0。
传递切片给可变参数
我们已经提到 ...T在内部表示为类型是
[]T切片。如果真是这样,可以传递一个切片给可变参数吗?让我们从下面的例子中寻找答案:
package main import ( "fmt" ) func find(num int, nums ...int) { fmt.Printf("type of nums is %T\n", nums) found := false for i, v := range nums { if v == num { fmt.Println(num, "found at index", i, "in", nums) found = true } } if !found { fmt.Println(num, "not found in ", nums) } fmt.Printf("\n") } func main() { nums := []int{89, 90, 95} find(89, nums) }
在第 23 行,我们没有将若干数量的参数传递给
find的最后一个参数, 而是传递了一个切片。这是非法的,我们不能传递一个切片给可变参数。上面的程序将报错:
main.go:23: cannot use nums (type []int) as type int in argument to find。
这里有一个语法糖可以用来将切片传递给变参函数。可以在切片后面加
...,这样会将切片展开为其中的各个元素并将它们传递给变参函数。这样该程序将正常工作。
上面的程序如果将第23行的
find(89, nums)改为
find(89, nums...),程序将通过编译,并输出如下:
type of nums is []int 89 found at index 0 in [89 90 95]
相关文章推荐
- Golang教程:(十二)变参函数
- Golang教程之不可重入函数的实现方法
- Golang教程:(六)函数
- Golang初级系列教程-函数多个返回值
- Linq to Oracle 使用教程(六)将数据库的函数映射到方法
- 帝国cms教程之常用函数用法及实例
- linux网络编程之socket(十二):select函数的并发限制和 poll 函数应用举例
- 使用silverlight构建一个工作流设计器(十二)(附源代码下载、在线演示、视频教程)
- 百为STM32开发板教程之十二——NAND FLASH
- Java NIO系列教程(十二) Java NIO与IO
- Kotlin教程之函数和包的定义和流程控制
- Android 音乐播放器的开发教程(十二)SQLite的使用及我的最爱歌曲的实现 ----- 小达
- C语言入门教程 (十) 函数的定义和调用
- PHP 学习笔记(一):基础教程:语法,变量,函数,数组,超全局
- 使用jQuery中的wrap()函数操作HTML元素的教程
- AngularJS权威教程 笔记(AngularJS是一个很有意思的库,基于函数形参的依赖注入?酷!还有奇怪的$scope和指令)
- golang语法学习(二):控制语句,函数,以及错误处理。
- Freemarker页面语法、函数教程
- Idle 函数@GTK+ 2.0 中文教程连载
- Python教程学习简记2--Python 函数调用 定义函数 函数的参数 递归函数