一般情况一个函数的传入参数都是固定的,但是有一些函数能传入不定数量的参数(可变长的)。比如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{}类型。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
广告
暂无评论内容