|
以下是一段我有疑问的 Go 代码。具体来说,a这个函数是什么?
7 {1 S, }7 K" Q3 y1 m7 S+ j3 Dfunc DPrintf(format string,a ...interface{}) (n int,err error) { if Debug > 0{ n,err = fmt.Printf(format,a...) } return}) o8 N7 B5 y6 a% v8 S+ b9 j
谁能告诉我这里的三点是什么?它有什么作用?...interface{}?5 G1 {& K9 }7 _1 h4 t
3 ?5 R K, c; e# u+ C: a( o
解决方案:
4 {- Y7 ~$ j: I% i 以三个点 (…) 为前缀的参数类型称为可变参数。这意味着你可以将任何数字或参数传递给参数(就像 with fmt.Printf()。该函数将接收参数的参数列表作为参数声明的切片([]interface{}在你的情况下)。围棋标准状态:
: c- p! d5 a' d. Z _5 ?% w函数签名中的最后一个参数可能是 … 是前缀的类型。具有此参数的函数称为可变参数,并可调用该参数的零或多个参数。+ ^ x+ F0 {5 C
一个参数:6 F3 C: z" ?0 Q4 p; Q% u
a ...interface{}9 x+ W; H3 d6 E9 y0 `! q6 j0 b
是的,等价函数:; t- X; `, n0 B* T3 N6 L# g' S( w
a []interface{}
& h; N0 s+ g* e0 ^9 s4 I. B6 o( g 不同之处在于你如何将参数传递给这样的函数。它可以通过提供切片的每个元素或作为单个切片来完成。在这种情况下,须使用三点作为切片值的后缀。以下示例将导致相同的呼叫:" v' `0 G n; ~
fmt.Println("First","Second","Third")
+ t* o9 }* N, a1 A/ d% l; A 会做同样的事:, b, N* d7 Y* J) r% L; ^# F! c. U
s := []interface{}{"First","Second","Third"}fmt.Println(s...), x* k* {( S$ ]; |! w+ z9 A+ s
这在Go 规范也有很好的解释:
% ^0 k( _ u7 ^8 O给定函数和调用, r2 Q2 s2 d# q& J; c6 c
golang func Greeting(prefix string,who ...string) Greeting("nobody") Greeting("hello:","Joe","Anna","Eileen")
( ~/ S- ^1 W1 ?- t内Greeting,who将nil第一次调用和[]string{"Joe","Anna","Eileen"}在第二次调用中有值。7 D) Q4 X! o2 S9 U
如果最后一个参数可以分配给切片类型[]T,并且...T参数后跟.... 在这种情况下,不会创建新的切片。# e& l, K6 p I
鉴于切片s和调用% J# ]$ L. |$ k x1 u( E
golang s := []string{"James","Jasmine"} Greeting("goodbye:",s...)
6 v( a( {2 t' J. Q) o内Greeting,who将具有s与底层数组相同的值。 |
|