Go语言的可变(不定)长参数函数
2023-06-13 09:13:28 时间
一般情况一个函数的传入参数都是固定的,但是有一些函数能传入不定数量的参数(可变长的)。比如c语言中的printf。可以看:《C语言“…”占位符及可变参数函数》 在Go语言中,也有这样的函数。用法类似,也是三个点。
可变参数函数声明
申明方法
func Function(args …Type) {
}
上面的三个点(…)
表示args
是一个可变参数。在函数Function
中,参数args
会被当做一个slice
来处理的。
例子
// 这个函数可以传入任意数量的整型参数
func sum(nums ...int) {
fmt.Println(nums)
total := 0
for _, num := range nums {
total += num
}
fmt.Println(total)
}
可变参数函数的使用
func main() {
sum(1, 2)
sum(1, 2, 3)
}
可变参数的用法和一般的参数一样,只是可以随意的指定参数的个数。
给可变参数函数传递数组
当然,我们的参数可能本来就是一个slice,但是函数不允许传入参数。所以只能反过来,把slice打散传入给函数。
func main() {
// 如果你需要传入的参数在一个slice中,像下面一样
// "func(slice...)"把slice打散传入
nums := []int{1, 2, 3, 4}
sum(nums...)
}
传参时的类型转换错误
这是我遇到的一个问题,在调用一个可变参数函数的时候。如果我把slice手动使用Function(slice[0],slice[1])
这样传入,可以编译运行,但是如果我使用Function(slice …)就会爆如下错误。
cannot use args (type []string) as type []interface {} in function argument
相关代码
package main
import (
"fmt"
"flag"
)
func main() {
flag.Parse()
fmt.Println(flag.Args()...)
}
这是我在stackoverflow找到的问题的原因。(上面你的代码也来自stackoverflow
的)
其实,从错误代码中也可以看出来,这是变量类型的问题。[]string
和[]interface {}
类型的问题。估计在使用Function(slice…)
这种,打散数组传递时,函数是直接把slice
传递进去,而不是像一般的用法那样,单个合并到slice
里。string
传递给interface{}
类型的变量是允许的,但是[]string
无法转换成[]interface{}
类型。
对此,我们只能手动把[]string类型转换成[]interface{}
类型,再传入。
old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
new[i] = interface{}(v)
}
fmt.Println(new...)
所以,只能写一个循环,把[]string类型转换成[]interface{}类型。
相关文章
- GoLand 2022 for Mac(GO语言集成开发工具环境) v2022.2.3中文激活版
- Go语言优雅关闭与重启
- 化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07
- 由鸭子测试看 Go 语言的接口实现
- 2.Go语言编程学习课后实践
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- Go 语言怎么使用变长参数函数?
- GoLang9 - Go语言函数
- Go 语言开源项目使用的函数选项模式
- Go 语言数组和切片的区别
- Go语言——方法
- Go语言匿名函数——没有函数名字的函数
- Go语言闭包(Closure)——引用了外部变量的匿名函数
- Go语言可变参数(变参函数)
- Go语言计算函数执行时间
- Go语言导出包中的标识符——让外部访问包的类型和值
- Go语言圣经-函数递归习题详解编程语言
- Go语言圣经–包和文件-包初始化习题详解编程语言
- Go语言使用事件系统实现事件的晌应和处理
- Go语言网络爬虫概述
- Go语言函数中的参数传递效果测试
- Go语言TCP协议
- Go语言从INI配置文件中读取需要的值
- Go语言哈希函数
- 编程新精英:Go语言 Redis开发(go语言redis开发)
- 轻松搞定Go语言连接MySQL(go连接mysql)
- 简易教程:如何在 Linux 上安装 GO 语言(go语言安装linux)
- 使用Go语言实现Redis数据库(用go实现redis)
- Go语言查询Oracle数据库实战实例(go语言查询oracle)
- Go语言搭建Oracle数据库快速连接方法(go语言连接oracle)
- 数据库探索Go语言与Oracle数据库的结合(go语言中的oracle)
- 语言Oracle中发挥神奇作用的Go语言(oracle中有go)