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

时间:2014-05-15 05:11:16

标签: go

以下是我对此有疑问的Go代码。 具体来说,这个函数中的a是什么?

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

有人能告诉我这里的三个点是什么吗? ...interface{}做了什么?

2 个答案:

答案 0 :(得分:143)

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

  

函数签名中的最后一个参数可能有一个带前缀的类型....带有这样一个参数的函数叫做variadic,可以用该参数的零个或多个参数调用。

参数:

a ...interface{}

对于相当于:

的功能
a []interface{}

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

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

将做同样的事情:

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

Go Specification中也很好地解释了这一点:

  

给定功能并调用

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

Greeting内,who在第一次调用中的值为nil,在第二次调用中的值为[]string{"Joe", "Anna", "Eileen"}

     

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

     

给出切片s并调用

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

Greeting中,whos具有相同的基础数组具有相同的值。

答案 1 :(得分:6)

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

这类似于C#中的java.lang.objectsystem.object,而是包含语言中的每个变量类型。所以它允许你传递任何方法。