2013-07-09 10 views
41

Tak więc w Pythonie i Ruby znajduje się operator splat (*) do rozpakowywania tablicy jako argumentów. W JavaScript istnieje funkcja .apply(). Czy istnieje sposób rozpakowywania tablicy/plasterka jako argumentów funkcji w Go? Wszelkie zasoby na to również będą świetne!Go Rozpakuj tablicę jako argumenty

Coś wzdłuż linii to:

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

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

ja przepraszam jeśli jestem Dokonywanie składniowe/Różne błędy. Jestem nowy w Go.

+1

Przede wszystkim, 'arr' nie jest tablicą. To jest * kawałek *. – newacct

Odpowiedz

67

Można użyć składni vararg podobny do 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) 
} 

Teraz można podsumować tak wiele rzeczy, jak chcesz. Zwróć uwagę na ważne ... po wywołaniu funkcji my_func.

Running przykład: http://ideone.com/8htWfx

+0

który jest NIESAMOWITY !. Dzięki –

-6

Nie, nie ma bezpośredniego wsparcia dla tego produktu w języku. Python i Ruby, a także JavaScript, o którym wspomniałeś; są wszystkie języki dynamiczne/skryptowe. Go jest o wiele bardziej bliższy, na przykład C niż jakikolwiek dynamiczny język. Funkcja "Zastosuj" jest przydatna w przypadku języków dynamicznych, ale jest mało przydatna w przypadku języków statycznych, takich jak C lub Go,

+1

Mylisz się, https://golang.org/ref/spec#Passing_arguments_to_..._parameters – user7610

5

Albo twoja funkcja to varargs, w której możesz użyć wycinka z notacją ..., jak pokazuje Hunter McMillen, lub twoja funkcja ma ustaloną liczbę argumentów i możesz rozpakować je podczas pisania kodu.

Jeśli naprawdę chcesz to zrobić dynamicznie w zależności od ustalonej liczby argumentów, można użyć refleksji:

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

Jestem ciekawy, jak te testy porównawcze względem podejścia varargs. Zakładam, że działałby mniej wydajnie, ale będę musiał się nad tym zastanowić. –

+0

@HunterMcMillen uzyskałeś informacje na temat porównania wydajności? – AkiRoss

+0

@AkiRoss prawdopodobnie, ale to było tak dawno temu, że zapomniałem wyników: | –