在Go语言中,
[]string
是一个字符串数组
并且我们也将其...string
用作参数。
有什么不同?
功能定义:
func f(args ...string) {}
我可以像下面这样调用此函数吗?
args := []string{"a", "b"}
f(args)
Answers:
[]string
是一个字符串数组
从技术上讲,这是引用基础数组的切片
并且我们也将其
...string
用作参数。有什么不同?
关于结构,真的没有。两种语法得出的数据类型相同。
该...
参数语法形成了可变参数的参数。它将接受零个或多个string
参数,并将它们作为切片引用。
关于调用f
,您可以使用以下语法将字符串的一部分传递给variadic参数:
func f(args ...string) {
fmt.Println(len(args))
}
args := []string{"a", "b"}
f(args...)
此语法可用于使用文字语法构建的切片,或表示可变参数的切片(因为它们之间实际上没有区别)。
[]string
语法创建的切片之间的区别的问题。我将在答案中添加更多引号,以使其更清楚。:-)
两者都创建一个字符串数组,但是区别在于调用方式。
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 : []
[]string
是切片,而不是数组。数组和切片之间的差异很细微但很重要。