【问题标题】:What is the difference between []string and ...string in golang?golang 中的 []string 和 ...string 有什么区别?
【发布时间】:2012-10-06 03:17:18
【问题描述】:

在 Go 语言中,

[]string 是一个字符串数组

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

有什么区别?

函数定义:

func f(args ...string) {}

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

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

f(args)

【问题讨论】:

    标签: string go


    【解决方案1】:

    []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你可以找到我的实验。如果有人想要一些调试打印功能,去看看我的游乐场。
    【解决方案2】:

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

    func f(args ...string) {
    
    }
    // Would be called like this:
    
    f("foo","bar","baz");
    

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

    fmt.Print 和朋友就是一个很好的例子,他们可以接受任意数量的参数。

    【讨论】:

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

    这是你想要的:

    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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-26
        • 2016-11-09
        • 2012-08-11
        • 2018-06-07
        • 2021-12-21
        • 2012-05-21
        • 2011-10-25
        相关资源
        最近更新 更多