2013-07-09 5 views
41

したがって、PythonとRubyには配列を引数としてアンパックするsplat演算子(*)があります。 Javascriptには.apply()関数があります。 Goの関数引数として配列/スライスをアンパックする方法はありますか?これのためのあらゆるリソースも素晴らしいでしょう!この線に沿って引数として配列を展開する

何か:

func my_func(a, b int) (int) { 
    return a + b 
} 

func main() { 
    arr := []int{2,4} 
    sum := my_func(arr) 
} 

私は各種/構文ミスを作っている場合、私は謝ります。私は新しいです。あなたが好きな

package main 
import "fmt" 

func my_func(args ...int) int { 
    sum := 0 
    for _,v := range args { 
     sum = sum + v 
    } 

    return sum; 
} 

func main() { 
    arr := []int{2,4} 
    sum := my_func(arr...) 
    fmt.Println("Sum is ", sum) 
} 

今、あなたはできるだけ多くのものを合計することができます

+1

まず、 'arr'は配列ではありません。これは*スライス*です。 – newacct

答えて

67

あなたがCに似た可変引数構文を使用することができます。 my_func関数を呼び出した後は、重要な...に注意してください。

実行例:http://ideone.com/8htWfx

+0

それは素晴らしいです!ありがとう –

-6

いいえ、言語では、このための直接的なサポートはありません。 PythonとRuby、そしてあなたが言及しているJavascriptがあります。すべて動的/スクリプト言語です。 Goは、たとえばCなどの動的言語よりも、より近い方法です。 「適用」機能は、動的言語のために、しかし、Cまたは移動のような静的な言語のためにほとんど使用に便利です

+1

あなたは間違っています、https://golang.org/ref/spec#Passing_arguments_to_..._パラメータ – user7610

5

どちらかあなたの関数を使用すると、ハンターマクミランが示すよう...表記でスライスを使用することが可能な可変引数、である、またはあなたの関数は固定数の引数を持ち、コードを書くときに関数を展開することができます。

あなたが本当に引数の固定数の関数で動的にこれを実行したい場合は、リフレクションを使用することができますが、すべての

package main 
import "fmt" 
import "reflect" 

func my_func(a, b int) (int) { 
    return a + b 
} 

func main() { 
    arr := []int{2,4} 
    var args []reflect.Value 
    for _, x := range arr { 
     args = append(args, reflect.ValueOf(x)) 
    } 
    fun := reflect.ValueOf(my_func) 
    result := fun.Call(args) 
    sum := result[0].Interface().(int) 
    fmt.Println("Sum is ", sum) 
} 
+0

私はこの基準がvarargsアプローチに対してどのようにベンチマークしているかを知りたいと思います。私はそれがあまり効率的に実行されないだろうと思うだろうが、私はそれを調べなければならないだろう。 –

+0

@HunterMcMillenパフォーマンス比較の洞察はありますか? – AkiRoss

+0

@AkiRossおそらく、それはずっと前に私は結果を忘れてしまった:| –

関連する問題