go语言同其他编程一样也提供了对变参函数的支持。本文简单讲解一下go中变参函数的使用方法。

指定类型参数

不定参数是指函数传入参数的个数为不确定数量,个数需要在调用的时候才能得到确定。go语言中接受不定参数的函数的原型如下所示:

func myfunc(args ...type)

func myfunc(arg1 int, args ...type)

这段代码的意思是,函数func()接受不定数量的参数,这些参数的类型全部是type。形如…type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。它是一个语法糖( syntactic sugar),即这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说,使用语法糖能够增加程序的可读性,从而减少程序出错的机会。

从内部实现机理上来说,类型…type本质上是一个数组切片,也就是[]type。

func myfunc(args ...int) {
for _, arg := range args {
fmt.Println(arg)
}
}

参数args可以用for循环来获得每个传入的参数。假如没有…type这样的语法糖,开发者将不得不这么写:

func myfunc2(args []int) {
for _, arg := range args {
fmt.Println(arg)
}
}

myfunc和myfunc2从函数的实现角度来看并没有太大的区别。从调用的角度来看,myfunc2则比较简洁,不用显示加上[]int{}来构造一个数组切片实例。

myfunc2([]int{1, 3, 7, 13})

虽然我们定义了…type,但是可以不传入参数。看下面的示例:

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(1, 2, 1, 4)
find(5)
}
type of nums is []int
1 found at index 1 in [2 1 4] type of nums is []int
5 not found in []

find(5)这个调用中只有传入了一个参数。没有传递任何参数给 nums …int。这是合法的,如果没有给可变参数传递任何值,则可变参数为 nil 切片,在这里 nums 是一个 nil 切片,长度和容量都是0

任意类型参数的变参

上面的例子将不定参数类型约束为type,固定为type类型,如果你希望传任意类型并且任意个参数,可以指定类型为

interface{}。原型如下:

func myfunc3(args ...interface{}) {
// ...
}
func myfunc3(arg1 string, args ...interface{}) {
// ...
}

用interface{}传递任意类型数据是Go语言的惯例用法。使用interface{}仍然是类型安全的,

package main
import "fmt"
func MyPrintf(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is a string value.")
case int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}
func main() {
var v1 int = 1
var v2 int64 = 1111
var v3 string = "hello world!"
var v4 float32 = 1.1111
MyPrintf(v1, v2, v3, v4)
} //输出为: 1 is an int value.
1111 is an int64 value.
hello world is a string value.
1.1111 is an unknown type.

最新文章

  1. 【强烈推荐】如何给TortoiseGit 配置密钥?
  2. Google Guava之--cache
  3. [团队项目3.0]Scrum团队成立
  4. C#之装箱与拆箱
  5. RHEL7安装配置TigerVNC
  6. [BZOJ 2821] 作诗(Poetize) 【分块】
  7. js点击button按钮跳转到另一个新页面
  8. [Bnuz OJ]1176 小秋与正方形
  9. Noip2017 普及 T3 Chess
  10. 请求数据loading
  11. 解决svn更新项目目录时“Error:svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted”的报错问题
  12. Python学习笔记九
  13. DRF 中使用 级验科技滑动验证
  14. npm太慢, 淘宝npm镜像使用方法
  15. 使用mysql,sql语言删除冗余信息
  16. Oracle提权
  17. 【iCore1S 双核心板_ARM】例程二:读取ARM按键状态
  18. 2018/09/17《涂抹MySQL》【性能优化及诊断】学习笔记(七)
  19. python:获取访问访问时的响应时间
  20. linux-CentOS初学terminal命令(3)rm、chmod、mkdir、who、w、id、systemctl、

热门文章

  1. 怎样判断有没有SQL注入漏洞及原理?
  2. 201871010114-李岩松《面向对象程序设计(java)》第七周学习总结
  3. ATM功能实现项目
  4. Javascript模块化开发2——Gruntfile.js详解
  5. spark和 mapreduce的比较
  6. ACE框架 基于共享内存的分配器
  7. react一写工具
  8. vim用户手册笔记常用操作整理
  9. proxy protocol
  10. react create-react-app使用less 及关闭eslint