140

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

4 回答 4

208

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

现在,您可以根据需要汇总任意数量的内容。调用函数...时注意重要的after 。my_func

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

于 2013-07-09T19:01:46.693 回答
12

您的函数是可变参数,您可以在其中使用带有...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)
}
于 2013-07-10T02:35:28.580 回答
-2

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

我有理由从带有单引号的 map[string]string 中解压缩一些变量,也可以不使用单引号。这是它的逻辑,顶部的播放链接具有完整的工作片段。

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');
于 2019-11-05T03:47:47.587 回答
-23

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

于 2013-07-09T19:02:42.543 回答