2016-06-13 7 views
0

以下は、リフレクション ドキュメントのMakeFuncの例です。私はそれがどのように動作するかを理解しています。私は理解していないWHATvariadic関数をreflect.MakeFuncで使用する方法

// Make and call a swap function for ints. 
var intSwap func(int, int) (int, int) 
makeSwap(&intSwap) 
fmt.Println(intSwap(0, 1)) 

は一体で、それが 可変引数の入力で使用することができる方法です。

var intswap func(...int) (...int) // Got to be wrong 
var intswap func(...int) (int, int) // Will not work even with 2 inputs 

誰かが可変的な入力を使ってMakeFuncの例を挙げることができますか?

ネット上のどこにもサンプルが見つかりません!

おかげ

答えて

1

可変長引数はちょうどスライスとして表されているので、あなたの例では、スワップ関数の引数ではなく、複数の値の、値の単一のスライスになります。スライス値には、Value.Indexメソッドを使用してアクセスできます。https://play.golang.org/p/2b22FV_5v8

swap := func(in []reflect.Value) []reflect.Value { 
    return []reflect.Value{in[0].Index(1), in[0].Index(0)} 
} 

makeSwap := func(fptr interface{}) { 
    fn := reflect.ValueOf(fptr).Elem() 
    v := reflect.MakeFunc(fn.Type(), swap) 
    fn.Set(v) 
} 

var intSwap func(...int) (int, int) 
makeSwap(&intSwap) 
fmt.Println(intSwap(0, 1)) 
関連する問題