【发布时间】:2012-10-06 03:17:18
【问题描述】:
在 Go 语言中,
[]string 是一个字符串数组
我们也使用...string作为参数。
有什么区别?
函数定义:
func f(args ...string) {}
我可以像下面这样调用这个函数吗?
args := []string{"a", "b"}
f(args)
【问题讨论】:
在 Go 语言中,
[]string 是一个字符串数组
我们也使用...string作为参数。
有什么区别?
函数定义:
func f(args ...string) {}
我可以像下面这样调用这个函数吗?
args := []string{"a", "b"}
f(args)
【问题讨论】:
[]string是一个字符串数组
从技术上讲,它是一个引用底层数组的切片
我们也使用
...string作为参数。有什么区别?
关于结构,没什么。两种语法产生的数据类型相同。
... 参数语法构成可变参数。它将接受零个或多个 string 参数,并将它们作为切片引用。
关于调用f,您可以使用以下语法将一段字符串传递给可变参数:
func f(args ...string) {
fmt.Println(len(args))
}
args := []string{"a", "b"}
f(args...)
此语法可用于使用文字语法构建的切片,或表示可变参数的切片(因为它们之间实际上没有区别)。
【讨论】:
[]string 是一个切片,而不是一个数组。数组和切片之间的区别很微妙但很重要。
[]string 语法创建。我将在我的答案中添加更多引用以使其更清楚。 :-)
println 使用省略号? Here你可以找到我的实验。如果有人想要一些调试打印功能,去看看我的游乐场。
两者都创建一个字符串数组,但区别在于它的调用方式。
func f(args ...string) {
}
// Would be called like this:
f("foo","bar","baz");
这允许您接受可变数量的参数(所有相同类型)
fmt.Print 和朋友就是一个很好的例子,他们可以接受任意数量的参数。
【讨论】:
def fn(*args) 构造几乎相同。
这是你想要的:
var args []string = []string{"A", "B", "C"}
func Sample(args ...string) {
for _, arg := range args {
fmt.Println(arg)
}
}
func main() {
Sample(args...)
}
【讨论】:
它简化了您的函数参数。这是一个例子(https://play.golang.org/p/euMuy6IvaM): 方法 SampleEllipsis 接受从零到多个相同类型的参数,但在方法 SampleArray 中,必须声明 args。
package main
import "fmt"
func SampleEllipsis(args ...string) {
fmt.Printf("Sample ellipsis : %+v\n",args)
}
func SampleArray(args []string) {
fmt.Println("Sample array ")
SampleEllipsis(args...)
}
func main() {
// Method one
SampleEllipsis([]string{"A", "B", "C"}...)
// Method two
SampleEllipsis("A", "B", "C")
// Method three
SampleEllipsis()
// Simple array
SampleArray([]string{"A", "B", "C"})
// Simple array
SampleArray([]string{})
}
返回:
Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array
Sample ellipsis : [A B C]
Sample array
Sample ellipsis : []
【讨论】: