go - 将多个“参数”映射到单个可变参数的成语
问题描述
有没有办法在 golang 中采用可变参数的函数中使用 splatted 参数和简单参数(定义如下)的组合?如果没有,是否有一个近似此功能的著名成语?如果可能,是否有不需要重复类型名称的近似此功能的成语?
假设我在 golang 类型中有一个带有可变参数的函数...T
。您在呼叫站点的选择似乎仅限于:
- 多个简单参数,每个类型
T
,即f(…… x1, x2, x3 ……)
- 类型的单个splatted 参数
[]T
,即f(…… ...xs ……)
在 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
解决方案
使用所有参数创建一个切片并 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:])
推荐阅读
- flutter - 为什么 CustomSingleChildLayout 不能依赖于孩子的大小?
- swift - 如何使用标签显示正确的摘要
- uikit - “类型‘UIAlertController’没有成员‘样式’”
- android - 尝试添加网格布局时如何处理“发现现有项目依赖项不一致”的问题
- qt - 启动 QThread/QTimer 会使 qt/qml 应用程序在 Raspberry Pi 设备上使用 std::bad_alloc 崩溃
- c++ - 如果创建对象并为其赋值,转换构造函数会进行哪些转换?
- node.js - 是否可以在 nodejs 进程和 Electron 子进程之间进行通信?
- hashtable - 哈希表在数据库或服务器代码上实现在哪里?
- json - 显示从 http get 返回的 Json 数组
- python - 如何找到只有一个值的 Z 分数?