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


85

在Go语言中,

[]string 是一个字符串数组

并且我们也将其...string用作参数。

有什么不同?

功能定义:

func f(args ...string) {}

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

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

f(args)

Answers:


126

[]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


10
[]string是切片,而不是数组。数组和切片之间的差异很细微但很重要。
史蒂芬·温伯格

@StephenWeinberg:是的,我对“有什么区别”报价的“完全没有”回答是回答有关可变参数函数生成的切片与使用[]string语法创建的切片之间的区别的问题。我将在答案中添加更多引号,以使其更清楚。:-)
我讨厌懒惰的2012年

@IHateLazy有没有办法使内置的println省略号起作用?在这里您可以找到我的实验。如果有人希望使用一些调试打印功能,请观看我的游戏。
金库

14

两者都创建一个字符串数组,但是区别在于调用方式。

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 2012年

那么Go将可变参数作为数组类型的实例公开吗?太好了
Lightness在Orbit比赛,2012年

实际上,它们都创建了一片字符串,而不是数组。在golang中,它们是不同的东西。
PointerToConstantChar

两者都不创建字符串的“数组”,而是创建字符串的“ slice”。
伊南克·古姆斯


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 : []
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.