去传递

时间:2018-02-18 07:40:11

标签: go

我试图理解,函数中第1和第2个传递参数之间有什么区别。在这两种情况下,方法都是功能性和编译。

1)

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 - Variadic Function

2)Golang.org - Passing arguments正如@Himanshu所说。

1 个答案:

答案 0 :(得分:9)

根据Golang language specification

  

如果f是可变参数且最终参数p的类型为...... T,则在f内   p的类型等同于[] T的类型。如果用no调用f   p的实际参数,传递给p的值是nil。否则,   传递的值是一个带有新底层数组的[] 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脚本中的spread运算符,可以使用多个参数。例如: -

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)
    }
}