将数组作为参数解包


103

因此,在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)
}

如果我犯了语法错误或各种错误,我深表歉意。我是新手。


4
首先,arr不是数组。这是一片
newacct

Answers:


158

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


8

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

我很好奇,看看这种基准是如何对照varargs方法的。我认为它的效率会降低,但是我必须对其进行研究。
亨特·麦克米伦

@HunterMcMillen您是否对性能比较有任何了解?
AkiRoss 2015年

@AkiRoss可能是,但是很久以前我忘记了结果:|
亨特·麦克米伦2015年

大声笑,没什么大不了:我想无论如何它还是比较慢,也许我会自己进行一些测试。Thanx
AkiRoss

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');

-16

不,在此语言中没有直接支持。Python和Ruby,以及您提到的Javascript;都是动态/脚本语言。例如,Go比任何动态语言都更接近C。“应用”功能对于动态语言非常方便,但对于C或Go这样的静态语言却很少使用,


@ user7610您错了。您所引用的案件与所讨论的案件不同。在原始问题中,函数声明中没有可变参数。
user2846569 '18

是的,我猜是。可以将Python / Ruby的功能视为Go支持的反射调用的语法糖
user7610 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.