在go语言中,也有这样的函数。用法类似,也是三个点。
<code>1</code>
<code>// 这个函数可以传入任意数量的整型参数</code>
<code>2</code>
<code>func sum(nums ...</code><code>int</code><code>) {</code>
<code>3</code>
<code> </code><code>fmt.println(nums)</code>
<code>4</code>
<code> </code><code>total := 0</code>
<code>5</code>
<code> </code><code>for</code> <code>_, num := range nums {</code>
<code>6</code>
<code> </code><code>total += num</code>
<code>7</code>
<code> </code><code>}</code>
<code>8</code>
<code> </code><code>fmt.println(total)</code>
<code>9</code>
<code>}</code>
<code>func function(args …type) {</code>
上面的三个点(…)就表示args是一个可变参数。在函数function中,参数args是被当做一个slice来处理的。
<code>func main() {</code>
<code> </code><code>sum(1, 2)</code>
<code> </code><code>sum(1, 2, 3)</code>
可变参数的用法和一般的参数一样,只是可以随意的指定参数的个数。
当然,我们的参数可能本来就是一个slice,但是函数不允许传入参数。所以只能反过来,把slice打散传入给函数。
<code> </code><code>// 如果你需要传入的参数在一个slice中,像下面一样</code>
<code> </code><code>// "func(slice...)"把slice打散传入</code>
<code> </code><code>nums := []</code><code>int</code><code>{1, 2, 3, 4}</code>
<code> </code><code>sum(nums...)</code>
这是我遇到的一个问题,在调用一个可变参数函数的时候。如果我把slice手动使用function(slice[0],slice[1])这样传入,可以编译运行,但是如果我使用function(slice …)就会爆如下错误。
<code>cannot use args (type []string) as type []interface {} in function argument</code>
<code>01</code>
<code>package main</code>
<code>02</code>
<code>03</code>
<code>import (</code>
<code>04</code>
<code> </code><code>"fmt"</code>
<code>05</code>
<code> </code><code>"flag"</code>
<code>06</code>
<code>)</code>
<code>07</code>
<code>08</code>
<code>09</code>
<code> </code><code>flag.parse()</code>
<code>10</code>
<code> </code><code>fmt.println(flag.args()...)</code>
<code>11</code>
这是我在stackoverflow找到的问题的原因。(上面你的代码也是stackoverflow的)
其实,从错误代码中也可以看出来,这是变量类型的问题。[]string和[]interface {}类型的问题。估计在使用function(slice…)这种,打散数组传递时,函数是直接把slice传递进去,而不是像一般的用法那样,单个合并到slice里。string传递给ingerface{}类型的变量是允许的,但是[]string无法转换成[]interface {}类型。
对此,我们只能手动把[]string类型转换成[]interface {}类型,再传参。
<code>old := flag.args()</code>
<code>new</code> <code>:= make([]interface{}, len(old))</code>
<code>for</code> <code>i, v := range old {</code>
<code> </code><code>new</code><code>[i] = interface{}(v)</code>
<code>fmt.println(</code><code>new</code><code>...)</code>
所以,解法就是写一个循环,把[]string类型转换成[]interface{}类型。