天天看点

Go语言的可变(不定长)参数函数

在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{}类型。