web-dev-qa-db-fra.com

Déballer un tableau comme argument

Ainsi, dans Python et Ruby, il existe un opérateur splat (*) permettant de décompresser un tableau sous forme d'arguments. En Javascript, la fonction .apply (). Il existe un moyen de décompresser un tableau/slice en tant qu’arguments de fonction dans Go? Toutes les ressources pour cela seraient également utiles!

Quelque chose dans le sens de ceci:

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

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

Je m'excuse si je fais des erreurs syntaxiques/assorties. Je suis nouveau sur Go.

80
eatonphil

Vous pouvez utiliser une syntaxe vararg similaire à 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)
}

Maintenant, vous pouvez résumer autant de choses que vous le souhaitez. Remarquez l'important ... après quand vous appelez le my_func une fonction.

Exemple en cours d'exécution: http://ideone.com/8htWfx

122
Hunter McMillen

Soit votre fonction est varargs, dans laquelle vous pouvez utiliser une tranche avec le ... notation comme le montre Hunter McMillen, ou votre fonction a un nombre fixe d’arguments que vous pouvez décompresser lors de l’écriture de votre code.

Si vous voulez vraiment faire cela dynamiquement sur une fonction à nombre d'arguments fixe, vous pouvez utiliser la réflexion:

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