…interface {}(点点接口)的含义


92

以下是我有疑问的Go代码。具体来说,a此功能是什么?

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

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


31
该点称为椭圆。
埃里克·韦斯特鲁普

Answers:


160

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

函数签名中的最终参数可以具有以...为前缀的类型。具有此类参数的函数称为可变参数(variadic),并且可以使用零个或多个该参数的参数来调用该函数。

参数:

a ...interface{}

是,对于等于的功能:

a []interface{}

区别在于如何将参数传递给此类函数。可以通过分别给切片的每个元素或将其作为单个切片来完成,在这种情况下,您必须在切片值后缀三个点。以下示例将导致相同的调用:

fmt.Println("First", "Second", "Third")

将与以下操作相同:

s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)

Go规范中对此也作了很好的解释:

给定功能和调用

   func Greeting(prefix string, who ...string)
   Greeting("nobody")
   Greeting("hello:", "Joe", "Anna", "Eileen")

在中Greetingwhonil在第一个调用中具有值,在第二个调用中具有值[]string{"Joe", "Anna", "Eileen"}

如果最终参数可分配给切片类型[]T...T则在参数后跟时可以将其作为参数的值原样传递...。在这种情况下,不会创建新的切片。

给定切片s和调用

   s := []string{"James", "Jasmine"}
   Greeting("goodbye:", s...)

中的Greetingwho将具有s与相同基础数组相同的值。


10

就此而言interface{},它是一个空接口。换句话说,该接口由Go中的所有变量实现。

这有点类似于C#java.lang.ObjectSystem.Object在C#中类似,但是包含了语言中的每种变量类型。因此,它使您可以将任何内容传递给该方法。

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.