以下是我有疑问的Go代码。具体来说,a此功能是什么?
a
func DPrintf(format string, a ...interface{}) (n int, err error) { if Debug > 0 { n, err = fmt.Printf(format, a...) } return }
谁能告诉我这三个点是什么?怎么...interface{}办?
...interface{}
以三个点(…)为前缀的参数类型称为 可变参数 。这意味着您可以将任何数字或参数传递给该参数(就像使用一样fmt.Printf())。该函数将接收参数的参数列表,作为参数声明的类型的一部分([]interface{}在您的情况下)。执行规范指出:
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") 在中Greeting,who将nil在第一个调用中具有值,在第二个调用中具有值[]string{"Joe", "Anna", "Eileen"}。 如果最终参数可分配给切片类型[]T,...T则在参数后跟时可以将其作为参数的值原样传递...。在这种情况下,不会创建新的切片。 给定切片s和调用 s := []string{"James", "Jasmine"} Greeting("goodbye:", s...) 中的Greeting,who将具有s与相同基础数组相同的值。
给定功能和调用
func Greeting(prefix string, who ...string) Greeting("nobody") Greeting("hello:", "Joe", "Anna", "Eileen")
在中Greeting,who将nil在第一个调用中具有值,在第二个调用中具有值[]string{"Joe", "Anna", "Eileen"}。
Greeting
who
nil
[]string{"Joe", "Anna", "Eileen"}
如果最终参数可分配给切片类型[]T,...T则在参数后跟时可以将其作为参数的值原样传递...。在这种情况下,不会创建新的切片。
[]T
...T
...
给定切片s和调用
s
s := []string{"James", "Jasmine"} Greeting("goodbye:", s...)
中的Greeting,who将具有s与相同基础数组相同的值。