web-dev-qa-db-ja.com

引数として配列を展開する

だからPython and 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)
}

構文上の/さまざまな間違いを犯した場合は謝罪します。 Goは初めてです。

80
eatonphil

Cに似たvararg構文を使用できます。

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)
}

これで、必要なものをいくつでも合計できます。 ...関数を呼び出した後の重要なmy_funcに注意してください。

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

122
Hunter McMillen

ハンターマクミレンが示すように、あなたの関数は...表記でスライスを使用できる可変引数であるか、関数に固定数の引数があり、コードを記述するときにそれらをアンパックできます。

固定数の引数の関数でこれを本当に動的に行いたい場合は、リフレクションを使用できます。

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)
}
4
newacct