Перейти К Распаковке Массива В Качестве Аргументов


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

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

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

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

Я прошу прощения, если я делаю синтаксические/разные ошибки. Я новичок в этом деле.

3 53

3 ответа:

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

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

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

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

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

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