下面是一段我有疑问的 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{}
以三个点 (…) 为前缀的参数类型称为可变参数。这意味着您可以将任何数字或参数传递给该参数(就像 with fmt.Printf())。该函数将接收参数的参数列表作为为参数声明的类型的切片([]interface{}在您的情况下)。在围棋规范状态:
fmt.Printf()
[]interface{}
函数签名中的最后一个参数可能具有以 … 为前缀的类型。具有这种参数的函数称为可变参数,并且可以使用该参数的零个或多个参数调用。
一个参数:
a ...interface{}
是,对于等价于的函数:
a []interface{}
不同之处在于您如何将参数传递给这样的函数。它可以通过分别提供切片的每个元素或作为单个切片来完成,在这种情况下,您必须使用三个点作为切片值的后缀。以下示例将导致相同的调用:
fmt.Println("First", "Second", "Third")
会做同样的事情:
s := []interface{}{"First", "Second", "Third"} fmt.Println(s...)
这在Go 规范中也有很好的解释:
给定函数和调用 golang func Greeting(prefix string, who ...string) Greeting("nobody") Greeting("hello:", "Joe", "Anna", "Eileen") 内Greeting,who将nil在第一次调用和[]string{"Joe", "Anna", "Eileen"}第二次调用中具有值。 如果最后一个参数可分配给切片类型[]T,并且...T参数后跟.... 在这种情况下,不会创建新切片。 鉴于切片s和调用 golang s := []string{"James", "Jasmine"} Greeting("goodbye:", s...) 内Greeting,who将具有s与相同底层数组相同的值。
给定函数和调用
golang 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
golang s := []string{"James", "Jasmine"} Greeting("goodbye:", s...)
内Greeting,who将具有s与相同底层数组相同的值。