引数として配列を解凍する


103

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

構文上の誤りやさまざまな誤りを犯している場合は、謝罪します。Goは初めてです。


4
まずarr、配列ではありません。それはスライス
newacct 2013

回答:


158

Cと同様の可変引数構文を使用できます。

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


8

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

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

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

このベンチマークが可変引数アプローチに対してどのように評価されるかを知りたいと思います。パフォーマンスが低下すると思いますが、詳しく調べる必要があります。
ハンターマクミレン2013

@HunterMcMillenパフォーマンス比較について何か洞察を得ましたか?
AkiRoss

@AkiRossですが、結果を忘れてしまったのはずっと前のことです。|
ハンターマクミレン2015

大丈夫、大したことではありません:とにかく遅くなると思います、私はいくつかのテストを自分で実行するでしょう。Thanx
AkiRoss

0

https://play.golang.org/p/2nN6kjHXIsd

いくつかのvarをmap [string] stringからアンパックする理由がありました。それらの一部を囲むだけでなく、単一引用符で囲みました。これがそのロジックです。上にある再生リンクには完全に機能するスニペットがあります。

func unpack(a map[string]string) string {

var stmt, val string
var x, y []string
for k, v := range a {
    x = append(x, k)
    y = append(y, "'"+v+"'")
}

stmt = "INSERT INTO tdo.rca_trans_status (" + strings.Join(x, ", ")
val = ") VALUES (" + strings.Join(y, ",") + ");"

return stmt + val}

mssqlクエリの場合、次のようにきれいに表示されます。

INSERT INTO tdo.rca_trans_status (rca_json_body, original_org, md5sum, updated, rca_key) VALUES ('blob','EG','2343453463','2009-11-10 23:00:00','prb-180');

-16

いいえ、この言語での直接的なサポートはありません。PythonとRuby、そしてあなたが言及しているJavaScript。すべて動的/スクリプト言語です。Goは、動的言語よりも、たとえばCに非常に近いです。「適用」機能は動的言語には便利ですが、CやGoなどの静的言語にはほとんど役に立ちません。


@ user7610あなたは間違っています。問題のケースとは別のケースを参照しています。元の質問では、関数宣言に可変パラメータはありません。
user2846569

ええ、私はそうだったと思います。Python / Rubyが行うことは、Goがサポートするリフレクトコールの構文糖と考えることができます...
user7610
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.