当在go函数声明中的参数旁边时,"..."是什么意思?

Cha*_*aos 17 go

我正在阅读一些用Google的Go语言编写的代码,我遇到了这个:

func Statusln(a ...interface{})
func Statusf(format string, a ...interface{})
Run Code Online (Sandbox Code Playgroud)

我不明白是什么...意思.有人知道吗?

tux*_*21b 30

这意味着您可以使用可变数量的参数调用Statusln .例如,调用此函数:

Statusln("hello", "world", 42)
Run Code Online (Sandbox Code Playgroud)

将为参数指定以下值:

a := []interface{}{"hello", "world", 42}
Run Code Online (Sandbox Code Playgroud)

因此,您可以迭代此切片a并处理所有参数,无论有多少参数.可变参数的一个好的和流行的用例是例如fmt.Printf(),它接受格式字符串和可变数量的参数,这些参数将根据格式字符串进行格式化.


Sha*_*ews 7

它们是可变函数。这些函数接受数量可变的参数。

例子

下面的函数sums接受多个整数:

package main

import "fmt"

func sum(nums ...int) {
    fmt.Print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num
    }
    fmt.Println(total)
}

func main() {

    sum(1, 2)
    sum(1, 2, 3)

    nums := []int{1, 2, 3, 4}
    sum(nums...)
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息


om-*_*nom 5

它是可变长度的参数

func Printf(format string, v ...interface{}) (n int, err error) {
Run Code Online (Sandbox Code Playgroud)

以此签名为例.在这里我们定义我们有一个要打印的字符串,但是这个字符串可以用可变数量的东西(任意类型)插入到子集中(实际上,我从fmt包中获取了这个函数):

fmt.Printf("just i: %v", i)
fmt.Printf("i: %v and j: %v",i,j)
Run Code Online (Sandbox Code Playgroud)

正如您在此处所看到的,使用可变参数,一个签名适合所有长度.

此外,您可以指定一些确切的类型...int.