首页 > 解决方案 > 将多个“参数”映射到单个可变参数的成语

问题描述

有没有办法在 golang 中采用可变参数的函数中使用 splatted 参数和简单参数(定义如下)的组合?如果没有,是否有一个近似此功能的著名成语?如果可能,是否有不需要重复类型名称的近似此功能的成语?


假设我在 golang 类型中有一个带有可变参数的函数...T。您在呼叫站点的选择似乎仅限于:

在 Python 等其他一些语言中,可以使用可变参数捕获简单参数和 splatted 参数的组合:

$ python
>>> def foo(*args): return args
... 
>>> foo(1, 2, *[3, 4])
(1, 2, 3, 4)

但是,同样的事情似乎在 go 中不起作用。

// splat.go
package main

import "os"
import "fmt"

func write(args ...string) {
        for _, item := range args {
                fmt.Printf("%s\n", item)
        }
}

func main() {
        write("foobarbaz", os.Args[1:]...)
}

从错误消息中,很明显 splatted 参数和简单参数没有映射到同一个参数。

$ go run splat.go 
# command-line-arguments
./splat.go:14: too many arguments in call to write

标签: go

解决方案


使用所有参数创建一个切片并 splat 该切片。

write(append([]string{"foobarbaz"}, os.Args[1:]...)...)

如果该string, []string模式在应用程序代码中很常见,则考虑编写一个函数来简化调用站点的代码:

func stringArgs(s string, args []string) []string { 
   return append([]string{s}, args...)
}

...

write(stringArgs("foobarbaz", os.Args[1:])...)

或者

func writeStringArgs(s string, args []string) {
    write(append([]string{"foobarbaz"}, os.Args[1:]...)...)
}

...

writeStringArgs(s, os.Args[1:])

推荐阅读