Подтвердить что ты не робот

Перейти Распаковать массив как аргументы

Итак, в Python и Ruby существует оператор splat (*) для распаковки массива в качестве аргументов. В Javascript есть функция .apply(). Есть ли способ распаковать массив/срез в качестве аргументов функции в Go? Любые ресурсы для этого были бы замечательными!

Что-то вроде этого:

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

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

Я извиняюсь, если я делаю синтаксические/различные ошибки. Я новичок в Go.

4b9b3361

Ответ 1

Вы можете использовать синтаксис vararg, аналогичный 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)
}

Теперь вы можете суммировать столько, сколько захотите. Обратите внимание на важный ... после вызова функции my_func.

Пример выполнения: http://ideone.com/8htWfx

Ответ 2

Либо ваша функция является varargs, в которой вы можете использовать срез с нотой ..., как показывает Hunter McMillen, или ваша функция имеет фиксированное количество аргументов, и вы можете распаковать их при написании кода.

Если вы действительно хотите сделать это динамически на функции с фиксированным числом аргументов, вы можете использовать отражение:

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

Ответ 3

Нет, нет прямой поддержки для этого на языке. Python и Ruby, а также Javascript, который вы упоминаете; все языки динамического/сценария. Go намного ближе к, например, C, чем к любому динамическому языку. Функциональность "apply" удобна для динамических языков, но мало используется для статических языков, таких как C или Go,