ChatGPT解决这个技术问题 Extra ChatGPT

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

在 Go 语言中,

[]string 是一个字符串数组

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

有什么区别?

函数定义:

func f(args ...string) {}

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

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

f(args)

C
Community

[]string 是一个字符串数组

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

我们还使用 ...string 作为参数。有什么区别?

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

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

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

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


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

f(args...)

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

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


[]string 是切片,而不是数组。数组和切片之间的区别很微妙但很重要。
@StephenWeinberg:是的,我对“有什么区别”引用的“没什么”回答是回答有关可变参数函数参数生成的切片与使用 []string 语法创建的切片之间差异的问题。我将在我的答案中添加更多引用以使其更清楚。 :-)
@IHateLazy 有没有办法让内置 println 使用省略号? Here 你可以找到我的实验。如果有人想要一些调试打印功能,去看看我的游乐场。
t
tylerl

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

func f(args ...string) {

}
// Would be called like this:

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

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

fmt.Print 和朋友就是一个很好的例子,它们可以接受尽可能少或尽可能多的参数。


我不是 Go 专家,但不是一个可变参数,另一个不是单个数组参数,而且这两者不是像其他语言那样不同吗?
@LightnessRacesinOrbit 是的。如果不清楚,那么很抱歉造成混淆。关于两者都创建数组的第一行只是意味着两个实例中的结果参数都是一个数组。它与 python 的 def fn(*args) 构造几乎相同。
那么 Go 将可变参数公开为数组类型的实例?这是令人愉快的。
实际上他们都创建了一个字符串切片,而不是一个数组。它们在 golang 中是不同的东西。
两者都不会创建字符串的“数组”,而是创建字符串的“切片”。
E
Ertuğrul

这是你想要的:

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

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

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

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


P
Petre Sosa

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