将数组解压缩为参数

时间:2013-07-09 18:45:45

标签: 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)
}

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

4 个答案:

答案 0 :(得分:115)

您可以使用类似于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)
}

现在你可以根据自己的喜好加总。在您调用...函数后,请注意重要的my_func

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

答案 1 :(得分:5)

你的函数是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)
}

答案 2 :(得分:0)

https://play.golang.org/p/2nN6kjHXIsd

我有理由从map [string]字符串中解压缩一些var,并用一些单引号引起来。这是它的逻辑,并且顶部的播放链接具有完整的工作片段。

func unpack(a map[string]string) string {

var stmt, val string
var x, y []string
for k, v := range a {
    x = append(x, k)
    y = append(y, "'"+v+"'")
}

stmt = "INSERT INTO tdo.rca_trans_status (" + strings.Join(x, ", ")
val = ") VALUES (" + strings.Join(y, ",") + ");"

return stmt + val}

对于mssql查询,以下内容清楚地表示为:

INSERT INTO tdo.rca_trans_status (rca_json_body, original_org, md5sum, updated, rca_key) VALUES ('blob','EG','2343453463','2009-11-10 23:00:00','prb-180');

答案 3 :(得分:-10)

不,这种语言没有直接的支持。 Python和Ruby,以及你提到的Javascript;都是动态/脚本语言。 Go更接近于,例如,C,而不是任何动态语言。 “应用”功能对于动态语言非常方便,但对C或Go等静态语言几乎没有用处,