177 votes

Aller déballer Array comme arguments

Ainsi, en Python et Ruby, il existe l'opérateur splat (*) pour décomposer un tableau en arguments. En Javascript, il y a la fonction .apply(). Existe-t-il un moyen de décomposer un tableau/une tranche comme argument de fonction en Go ? Toute ressource à ce sujet serait également la bienvenue !

Quelque chose du genre 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 fautes de syntaxe ou autres. Je suis nouveau sur Go.

266voto

Hunter McMillen Points 17717

Vous pouvez utiliser une syntaxe vararg similaire à celle du 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 additionner autant de choses que vous le souhaitez. Notez les éléments importants ... après avoir appelé la my_func fonction.

Exemple concret : http://ideone.com/8htWfx

18voto

newacct Points 42530

Soit votre fonction est constituée de varargs, auquel cas vous pouvez utiliser une tranche avec la fonction ... comme le montre Hunter McMillen, ou votre fonction a un nombre fixe d'arguments et vous pouvez les décomposer en écrivant votre code.

Si vous voulez vraiment faire cela dynamiquement sur une fonction à nombre fixe d'arguments, 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)
}

-4voto

Bill H Points 1

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

J'avais une raison de décompresser certaines variables d'une chaîne map[string]string avec des guillemets simples autour de certaines d'entre elles ainsi que sans. Voici la logique de l'opération et le lien en haut de la page contient l'extrait complet de l'opération.

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}

Qui se présente proprement pour une requête mssql comme :

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');

-26voto

zzzz Points 23017

Non, il n'y a pas de support direct pour cela dans la langue. Python et Ruby, ainsi que le Javascript que vous mentionnez, sont tous des langages dynamiques/scripteurs. Le go est beaucoup plus proche du C, par exemple, que de tout autre langage dynamique. La fonctionnalité "apply" est pratique pour les langages dynamiques, mais peu utile pour les langages statiques comme C ou Go,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X