回答

收藏

interface{} 的含义

技术问答 技术问答 482 人阅读 | 0 人回复 | 2023-09-12

以下是一段我有疑问的 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 a
    s := []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与底层数组相同的值。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则