回答

收藏

interface{} 的含义

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

以下是一段我有疑问的 Go 代码。具体来说,a这个函数是什么?
7 {1 S, }7 K" Q3 y1 m7 S+ j3 D
    func 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与底层数组相同的值。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则