小编典典

interface{} 的含义

go

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

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

谁能告诉我这里的三个点是什么?有什么作用...interface{}


阅读 329

收藏
2021-12-01

共1个答案

小编典典

以三个点 (…) 为前缀的参数类型称为可变参数。这意味着您可以将任何数字或参数传递给该参数(就像 with fmt.Printf())。该函数将接收参数的参数列表作为为参数声明的类型的切片([]interface{}在您的情况下)。在围棋规范状态:

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

一个参数:

a ...interface{}

是,对于等价于的函数:

a []interface{}

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

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

会做同样的事情:

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

这在Go 规范中也有很好的解释:

给定函数和调用

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

Greeting,whonil在第一次调用和[]string{"Joe", "Anna", "Eileen"}第二次调用中具有值。

如果最后一个参数可分配给切片类型[]T,并且...T参数后跟.... 在这种情况下,不会创建新切片。

鉴于切片s和调用

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

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

2021-12-01