以下是我对此有疑问的Go代码。
具体来说,这个函数中的a
是什么?
func DPrintf(format string, a ...interface{}) (n int, err error) {
if Debug > 0 {
n, err = fmt.Printf(format, a...)
}
return
}
有人能告诉我这里的三个点是什么吗?
...interface{}
做了什么?
答案 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
中,who
与s
具有相同的基础数组具有相同的值。
答案 1 :(得分:6)
就interface{}
一词而言,它是空接口。换句话说,该接口由Go中的所有变量实现。
这类似于C#中的java.lang.object
或system.object
,而是包含语言中的每个变量类型。所以它允许你传递任何方法。