将数组解压缩为参数

eat*_*hil 86 go argument-unpacking

所以在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)
}
Run Code Online (Sandbox Code Playgroud)

如果我犯了语法/各种错误,我会道歉.我是Go的新手.

Hun*_*len 129

您可以使用类似于C的vararg语法:

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)
}
Run Code Online (Sandbox Code Playgroud)

现在你可以根据自己的喜好总结一下.注意...调用该my_func函数后的重要事项.

运行示例:http://ideone.com/8htWfx

  • 当函数期望 ```...interface{}``` 并且我们的切片是另一种类型时,我们如何处理 (8认同)
  • @Yogesh我可能有点晚了,但你总是可以做类似 `arr := [3]int{1, 2, 3}; 的事情 my_func(arr[:]...)`,它将它变成一个切片,然后解压它。 (5认同)

new*_*cct 6

要么你的函数是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)
}
Run Code Online (Sandbox Code Playgroud)