...interface{}(点点点接口)的含义

问题描述 投票:0回答:2

下面是一段我有疑问的Go代码。 具体来说,这个函数中的

a
是什么?

func DPrintf(format string, a ...interface{}) (n int, err error) {
  if Debug > 0 {
    n, err = fmt.Printf(format, a...)
  }
  return
}

谁能告诉我这三个点是什么?

...interface{}
有什么作用?

go ellipsis go-interface
2个回答
198
投票

以三个点 (...) 为前缀的参数类型称为 可变参数。这意味着您可以将任何数字或参数传递给该参数(就像使用

fmt.Printf()
一样)。该函数将接收参数的参数列表,作为为参数声明的类型的切片(在您的情况下为
[]interface{}
)。 Go 规范 指出:

函数签名中的最后一个参数可能具有以 ... 为前缀的类型。具有此类参数的函数称为可变参数,并且可以使用该参数的零个或多个参数来调用。

参数:

a ...interface{}

是,对于相当于的函数:

a []interface{}

区别在于如何将参数传递给这样的函数。它可以通过单独给出切片的每个元素或作为单个切片来完成,在这种情况下,您必须在切片值后加上三个点。以下示例将导致相同的调用:

fmt.Println("First", "Second", "Third")

将执行相同操作:

s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)

这在 Go 规范 中也得到了很好的解释:

给定函数和调用

   func Greeting(prefix string, who ...string)
   Greeting("nobody")
   Greeting("hello:", "Joe", "Anna", "Eileen")

Greeting
内,
who
在第一次调用中将具有值
nil
,在第二次调用中将具有
[]string{"Joe", "Anna", "Eileen"}

如果最后一个参数可分配给切片类型

[]T
,并且该参数后跟
...T
,则可以将其作为
...
参数的值原封不动地传递。在这种情况下,不会创建新切片。

给定切片

s
并调用

   s := []string{"James", "Jasmine"}
   Greeting("goodbye:", s...)

Greeting
内,
who
将与具有相同底层数组的
s
具有相同的值。


11
投票

interface{}
这个术语而言,它是空接口。换句话说,Go 中所有变量实现的接口。

这有点类似于 C# 中的

java.lang.Object
System.Object
,但包含了该语言中的所有变量类型。因此它可以让您将任何内容传递给该方法。

© www.soinside.com 2019 - 2024. All rights reserved.