golang中[] string和... string之间有什么区别?

时间:2012-10-16 04:44:40

标签: string go

使用Go语言

[]string是一个字符串数组

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

有什么区别?

功能定义:

func f(args ...string) {}

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

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

f(args)

4 个答案:

答案 0 :(得分:111)

  

[]string是一个字符串数组

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

的切片
  

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

     

有什么区别?

关于结构,没什么。两种语法产生的数据类型相同。

...参数语法生成一个可变参数。它将接受零个或多个string参数,并将它们作为切片引用。

关于调用f,您可以使用以下语法将一片字符串传递给variadic参数:

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


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

f(args...)

此语法可用于使用文字语法构建的切片,或表示可变参数的切片(因为它们之间确实没有区别)

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

答案 1 :(得分:13)

两者都创建了一个字符串数组,但不同之处在于它的调用方式。

func f(args ...string) {

}
// Would be called like this:

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

这允许您接受可变数量的参数(所有相同类型)

这方面的一个很好的例子是fmt.Print和朋友,他们可以接受你想要的少量或多少个。

答案 2 :(得分:4)

这是你想要的:

fieldOneAndTwo = [fieldOne, fieldTwo]

播放:http://play.golang.org/p/N1ciDUKfG1

答案 3 :(得分:1)

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