天天看點

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