Перейти Распаковать массив как аргументы
Итак, в 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.
Ответы
Ответ 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,