首页 > 解决方案 > 为什么这段代码要求我在函数声明中包含数组的大小?

问题描述

我正在尝试将 float64 数组传递给将添加值并返回总和的函数。我的代码如下:

func addThemNumbers(numbers []float64)  float64{
    sum := 0.0 
    for _,value := range numbers {
        sum += value 
    }
    return sum
}
func main() { 
    favNums := [2]float64 {0.9, 1.997}
    fmt.Println("Sum: ", addThemNumbers(favNums))
}

当我运行它时,它会产生这个错误:

/main.go:33:40: cannot use favNums (type [2]float64) as type []float64 in argument to addThemNumbers

但是,当我在我的函数中指定大小 2 时,addThemNumbers(numbers [2]float64)没有错误并且它运行。如果存在类型不匹配,我不明白为什么指定数组的大小有效。我已经看到了几个不需要在函数中指定数组大小的例子,那么我错过了什么?

标签: arraysfunctiongo

解决方案


[2]float64是一个数组。当你声明一个函数f([2]float64)时,你只能传递一个[2]float64类型值给它,当你这样做时,它会传递整个数组的副本。数组是固定大小的结构。

[]float64是一片。它本质上是一个包含指向数组的指针、长度和容量的结构。切片包含指向数组的指针,因此如果您有一个函数f([]float64),您可以将任何大小的数组传递给它,并且将传递对底层数组的引用,而不是该数组的副本。

要将数组转换为切片,您可以使用arr[:]. 在您的程序中:

    fmt.Println("Sum: ", addThemNumbers(favNums[:]))

推荐阅读