Golang 中将数组解包为参数

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

如果我犯了语法错误,我很抱歉,我是 Golang 新手。

115658 次浏览

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

不,语言中没有直接的支持。Python 和 Ruby,以及您提到的 Javascript,都是动态/脚本语言。例如,Go 更接近于 C 语言,而不是任何动态语言。‘ application’功能对于动态语言来说很方便,但是对于像 C 或 Go 这样的静态语言来说用处不大,

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

Https://play.golang.org/p/2nn6kjhxisd

我有一个理由从 map [ string ]字符串中解压一些 vars,它们中的一些周围有单引号,另一些则没有。下面是它的逻辑,顶部的播放链接有完整的工作代码片段。

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