|
以下是一段我有疑问的 Go 代码。具体来说,a这个函数是什么?: |) y' D" g& t2 `+ y
func DPrintf(format string,a ...interface{}) (n int,err error) { if Debug > 0{ n,err = fmt.Printf(format,a...) } return}
" W, ?) _& O' `( Z$ z 谁能告诉我这里的三点是什么?它有什么作用?...interface{}?2 H$ `& I! @/ o: ^
$ o6 y8 f5 D( _0 {3 A( A
解决方案: ) Z7 u& }. j: a6 x; V n. y4 {
以三个点 (…) 为前缀的参数类型称为可变参数。这意味着你可以将任何数字或参数传递给参数(就像 with fmt.Printf()。该函数将接收参数的参数列表作为参数声明的切片([]interface{}在你的情况下)。围棋标准状态:& t! ?& v w( Q* b! e
函数签名中的最后一个参数可能是 … 是前缀的类型。具有此参数的函数称为可变参数,并可调用该参数的零或多个参数。
( T& B2 v! Y+ [1 Y* e7 S一个参数:
7 S9 C! b0 u- d$ X' ~; [a ...interface{}
1 H4 q/ P l2 J8 B" p( x$ w 是的,等价函数:! }2 h% H$ w1 a/ Z% l( r1 |; Z4 J
a []interface{}
5 }! l8 R" v+ B% W 不同之处在于你如何将参数传递给这样的函数。它可以通过提供切片的每个元素或作为单个切片来完成。在这种情况下,须使用三点作为切片值的后缀。以下示例将导致相同的呼叫:6 L- m O/ v6 k& ]# \) T4 B* z
fmt.Println("First","Second","Third")& T3 b+ W% C* t( f
会做同样的事:
$ F* b) |8 o7 M1 F- n* G0 as := []interface{}{"First","Second","Third"}fmt.Println(s...)5 j. y" O8 q7 s1 X* O
这在Go 规范也有很好的解释:3 p* A+ B# }: W& p
给定函数和调用
$ g2 [0 J: Y4 U, y3 e2 {! Agolang func Greeting(prefix string,who ...string) Greeting("nobody") Greeting("hello:","Joe","Anna","Eileen")5 L0 H% R4 Y' f4 F& I4 _; T
内Greeting,who将nil第一次调用和[]string{"Joe","Anna","Eileen"}在第二次调用中有值。& Y0 q% j' d o4 \, I
如果最后一个参数可以分配给切片类型[]T,并且...T参数后跟.... 在这种情况下,不会创建新的切片。0 U4 y" c5 f. l7 x6 ]
鉴于切片s和调用
% V+ Q c j. E; e) ]golang s := []string{"James","Jasmine"} Greeting("goodbye:",s...)
) x) r4 I% I1 n内Greeting,who将具有s与底层数组相同的值。 |
|