2013-07-09 7 views
41

Also in Python und Ruby gibt es den Splat-Operator (*) zum Entpacken eines Arrays als Argumente. In Javascript gibt es die .apply() Funktion. Gibt es eine Möglichkeit, ein Array/Slice als Funktionsargumente in Go zu entpacken? Alle Ressourcen dafür wären auch gut!Auspacken Array als Argumente

Etwas nach dem Vorbild dieser:

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

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

ich entschuldige mich, wenn ich ein syntaktischen/sortierte Fehler mache. Ich bin neu in Go.

+1

Zunächst einmal 'arr' ist kein Array. Es ist ein * Stück *. – newacct

Antwort

67

Sie können eine Vararg Syntax ähnlich wie C verwenden:

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

Jetzt können Sie so viele Dinge zusammenfassen, wie Sie möchten. Beachten Sie die wichtigen ... nach, wenn Sie die my_func Funktion aufrufen.

Lauf Beispiel: http://ideone.com/8htWfx

+0

das ist super !. Danke –

-6

Nein, es gibt keine direkte Unterstützung für diese in der Sprache. Python und Ruby, sowie Javascript, das Sie erwähnen; sind alle dynamischen/Skriptsprachen. Go ist zum Beispiel näher an C als an irgendeine dynamische Sprache. Die ‚Anwendung‘ Funktionalität ist praktisch für dynamische Sprachen, aber nur von geringen Nutzen für statische Sprachen wie C oder Go,

+1

Sie liegen falsch, https://golang.org/ref/spec#Passing_arguments_to_..._parameters – user7610

5

Entweder Ihre Funktion ist varargs, in dem Sie ein Stück mit der ... Notation als Hunter McMillen zeigt, oder Ihre Funktion hat eine feste Anzahl von Argumenten und Sie können sie entpacken, wenn Sie Ihren Code schreiben.

Wenn Sie wirklich dynamisch feste Anzahl von Argumenten an eine Funktion dieses tun möchten, können Sie Reflektion verwenden:

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

Ich bin gespannt, wie dies gegen die varargs Ansatz benchmarks. Ich würde annehmen, dass es weniger effizient funktionieren würde, aber ich muss mich darum kümmern. –

+0

@HunterMcMillen haben Sie einen Einblick in den Leistungsvergleich bekommen? – AkiRoss

+0

@AkiRoss wahrscheinlich, aber es ist so lange her, dass ich die Ergebnisse vergessen habe: | –