含义... interface {}(点点点接口)

Buf*_*lls 83 go

下面是一段我对此有疑问的Go代码.具体来说,a这个功能是什么?

func DPrintf(format string, a ...interface{}) (n int, err error) {
  if Debug > 0 {
    n, err = fmt.Printf(format, a...)
  }
  return
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这三个点是什么?那怎么...interface{}办?

ANi*_*sus 151

前缀为三个点(...)的参数类型称为可变参数.这意味着您可以将任何数字或参数传递给该参数(就像使用fmt.Printf()).该函数将接收参数的参数列表,作为为参数声明的类型的片([]interface{}在您的情况下).在围棋规范状态:

函数签名中的最后一个参数可以具有前缀为的类型....具有这种参数的函数称为可变参数,并且可以使用该参数的零个或多个参数调用.

参数:

a ...interface{}
Run Code Online (Sandbox Code Playgroud)

是,对于功能相当于:

a []interface{}
Run Code Online (Sandbox Code Playgroud)

不同之处在于如何将参数传递给这样的函数.它可以通过单独给出切片的每个元素,也可以作为单个切片来完成,在这种情况下,您必须使用三个点对切片值进行后缀.以下示例将导致相同的调用:

fmt.Println("First", "Second", "Third")
Run Code Online (Sandbox Code Playgroud)

将做同样的事情:

s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Run Code Online (Sandbox Code Playgroud)

Go规范中也很好解释了这一点:

鉴于功能和电话

   func Greeting(prefix string, who ...string)
   Greeting("nobody")
   Greeting("hello:", "Joe", "Anna", "Eileen")
Run Code Online (Sandbox Code Playgroud)

Greeting,who将有值nil在第一个呼叫,并[]string{"Joe", "Anna", "Eileen"}在第二位.

如果最终参数可分配给切片类型[]T,则可以将其作为...T参数的值(如果参数后跟参数)保持不变....在这种情况下,不会创建新切片.

鉴于切片s和电话

   s := []string{"James", "Jasmine"}
   Greeting("goodbye:", s...)
Run Code Online (Sandbox Code Playgroud)

在内部Greeting,who将具有s与相同底层数组相同的值.


Dra*_*yar 10

至于interface{}长期,它是空的接口.换句话说,该接口由Go中的所有变量实现.

这有点类似于C#java.lang.Object或者System.Object在C#中,但它包含了语言中的每个变量类型.因此,它允许您将任何内容传递给方法.