Go 可变参数函数的参数传递

3
我正在尝试理解,在函数中第一个和第二个传入参数之间的区别。在两种情况下,方法都是功能性的并且可以编译。
generateReport(capacities...)

func generateReport(capacities ...float64) {
    for i, cap := range capacities {
        fmt.Printf("Plant %d capacity %.0f\n", i, cap)
    }
}

2)
generateReport(plantCapacities)

func generateReport(capacities []float64) {
    for i, cap := range capacities {
        fmt.Printf("Plant %d capacity %.0f\n", i, cap)
    }
}

我找到了几个好的示例

1) GolangBot - 可变参数函数

2) 如 @Himanshu 所提到的,Golang.org - 传递参数


这个问题显示出完全没有进行最基本的研究,因为浏览任何关于Go的介绍材料都应该涵盖它。 - kostix
“inctoructory” 是俄语单词吗? - 7urkm3n
这应该是一个介绍性的内容。我非常确定那是普京的黑客在控制我的肥胖手指,就像他们通常所做的那样。 - kostix
1个回答

10
根据Golang语言规范,如果f是具有类型...T的参数p的变参函数,则在f内部,p的类型等效于[]T类型。如果f调用时对p没有实际参数,则传递给p的值为nil。否则,传递的值是一个新的[]T类型的切片,其底层数组是连续的实参,所有实参都必须可分配给T。因此,该切片的长度和容量是绑定到p参数的实参数量,并且可能因每个调用点而异。 variadic函数用于处理多个尾随参数。它可用于传递切片参数。
func main(){
  capacities := []float64{1, 2, 3, 4}
  generateReport(capacities...)
}

func generateReport(capacities ...float64) {
    for i, cap := range capacities {
        fmt.Printf("Plant %d capacity %.0f\n", i, cap)
    }
}

可变参数函数也可以像普通函数一样使用单独的参数进行调用。它类似于Java脚本中的展开运算符,可以接受多个参数。例如:

func main(){
  generateReport(1,2,3,4)
}

func generateReport(capacities ...float64) {
    for i, cap := range capacities {
        fmt.Printf("Plant %d capacity %.0f\n", i, cap)
    }
}

1
是的,请看这里 -> https://golangbot.com/variadic-functions 谢谢。 - 7urkm3n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接