在golang中,[]string和...string有什么区别?

99
在Go语言中,[]string 表示一个字符串数组,同时我们也使用 ...string 作为函数参数。这两者的区别是什么?函数定义如下:
func f(args ...string) {}

我可以像下面这样调用这个函数吗?

args := []string{"a", "b"}

f(args)
4个回答

141

[]string 是一个字符串数组。

从技术上讲,它是一个引用底层数组的切片。

我们还可以使用 ...string 作为参数。

有什么区别呢?

就结构而言,实际上没有什么不同。两种语法得到的数据类型是相同的。

... 参数语法创建了一个变参函数。它将接受零个或多个 string 类型的参数,并将它们作为一个切片进行传递。

在调用 f 函数时,您可以使用以下语法将一个字符串切片传递给可变参数:

func f(args ...string) {
    fmt.Println(len(args))
}


args := []string{"a", "b"}

f(args...)

这种语法适用于使用文字语法构建的切片,也适用于表示可变参数的切片 (因为它们之间实际上没有区别)

http://play.golang.org/p/QWmzgIWpF8


12
[]string 是一个切片(slice),而不是数组(array)。数组和切片之间的差别微妙但重要。 - Stephen Weinberg
@StephenWeinberg:是的,我的“没有什么特别的”回答针对的是有关可变函数参数生成的切片和使用[]string语法创建的切片之间的区别。我会在我的回答中添加更多引用内容以使其更加清晰明了。 :-) - I Hate Lazy
@IHateLazy 有没有办法让内置的 println 函数支持省略号?在这里 你可以找到我的实验。如果有人需要一些调试打印函数,可以去看看我的 playgound。 - vault

16

两者都创建了一个字符串数组,但不同之处在于如何调用该数组。

func f(args ...string) {

}
// Would be called like this:

f("foo","bar","baz");

这使您能够接受可变数量的参数(所有参数类型相同)。

一个很好的例子是fmt.Print和其他函数,它们可以接受任意多个参数。


我不是Go专家,但一个是可变参数,另一个是单个数组参数,这两者不像其他语言中那样明显吗? - Lightness Races in Orbit
1
@LightnessRacesinOrbit 没错。如果不清楚,那对造成的困惑我表示抱歉。第一行提到创建一个数组只是指两种情况下生成的结果参数都是一个数组。这与 Python 的 def fn(*args) 构造几乎完全相同。 - tylerl
所以Go将可变参数公开为数组类型的实例?这很令人愉悦。 - Lightness Races in Orbit
实际上,它们都创建了一个字符串切片,而不是数组。在golang中,它们是不同的东西。 - PointerToConstantChar
两者都不会创建一个字符串的“数组”,它们会创建一个字符串的“切片”。 - Inanc Gumus
对我很有帮助... +1 - Sahil Gulati

6

以下是您所需要的内容:

var args []string = []string{"A", "B", "C"}

func Sample(args ...string) {
    for _, arg := range args {
        fmt.Println(arg)
    }
}

func main() {
    Sample(args...)
}

Play: http://play.golang.org/p/N1ciDUKfG1


2
它简化了您的函数参数。这是一个例子(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 : []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接