下面是一段我对此有疑问的Go代码.具体来说,a
这个功能是什么?
func DPrintf(format string, a ...interface{}) (n int, err error) {
if Debug > 0 {
n, err = fmt.Printf(format, a...)
}
return
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这三个点是什么?那怎么...interface{}
办?
ANi*_*sus 151
前缀为三个点(...)的参数类型称为可变参数.这意味着您可以将任何数字或参数传递给该参数(就像使用fmt.Printf()
).该函数将接收参数的参数列表,作为为参数声明的类型的片([]interface{}
在您的情况下).在围棋规范状态:
函数签名中的最后一个参数可以具有前缀为的类型....具有这种参数的函数称为可变参数,并且可以使用该参数的零个或多个参数调用.
参数:
a ...interface{}
Run Code Online (Sandbox Code Playgroud)
是,对于功能相当于:
a []interface{}
Run Code Online (Sandbox Code Playgroud)
不同之处在于如何将参数传递给这样的函数.它可以通过单独给出切片的每个元素,也可以作为单个切片来完成,在这种情况下,您必须使用三个点对切片值进行后缀.以下示例将导致相同的调用:
fmt.Println("First", "Second", "Third")
Run Code Online (Sandbox Code Playgroud)
将做同样的事情:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Run Code Online (Sandbox Code Playgroud)
鉴于功能和电话
Run Code Online (Sandbox Code Playgroud)func Greeting(prefix string, who ...string) Greeting("nobody") Greeting("hello:", "Joe", "Anna", "Eileen")
内
Greeting
,who
将有值nil
在第一个呼叫,并[]string{"Joe", "Anna", "Eileen"}
在第二位.如果最终参数可分配给切片类型
[]T
,则可以将其作为...T
参数的值(如果参数后跟参数)保持不变...
.在这种情况下,不会创建新切片.鉴于切片
s
和电话Run Code Online (Sandbox Code Playgroud)s := []string{"James", "Jasmine"} Greeting("goodbye:", s...)
在内部
Greeting
,who
将具有s
与相同底层数组相同的值.
Dra*_*yar 10
至于interface{}
长期,它是空的接口.换句话说,该接口由Go中的所有变量实现.
这有点类似于C#java.lang.Object
或者System.Object
在C#中,但它包含了语言中的每个变量类型.因此,它允许您将任何内容传递给方法.
归档时间: |
|
查看次数: |
35922 次 |
最近记录: |