为什么这段代码要求我在函数声明中包含数组的大小?

我正在尝试将 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)没有错误并且它运行。如果存在类型不匹配,我不明白为什么指定数组的大小有效。我已经看到了几个不需要在函数中指定数组大小的例子,那么我错过了什么?


慕田峪4524236
浏览 105回答 3
3回答

三国纷争

[2]float64是一个数组。当你声明一个函数f([2]float64)时,你只能传递一个[2]float64类型值给它,当你这样做时,它会传递整个数组的副本。数组是固定大小的结构。[]float64是一片。它本质上是一个包含指向数组的指针、长度和容量的结构。切片包含指向数组的指针,因此如果您有一个函数f([]float64),您可以将任何大小的数组传递给它,并且将传递对底层数组的引用,而不是该数组的副本。要将数组转换为切片,您可以使用arr[:]. 在您的程序中:    fmt.Println("Sum: ", addThemNumbers(favNums[:]))

慕无忌1623718

数组和切片之间有区别。我想你要找的是一片。在函数参数中,您期望的是一个切片,而是传递了一个数组。有两种方法可以快速处理它:要删除类型不匹配,请在参数中提及大小,以便它现在接受一个数组(而不是切片)。将数组转换为切片fmt.Println("Sum: ", addThemNumbers(favNums[:]))

12345678_0001

实际上,当我们查看 []float64 和 [2]float64 时,它们看起来是一样的。但是有一个区别,即 []float64 是一个切片,而 [2]float64 是一个数组。因此,当您更改 addThemNumbers(numbers [2]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[:]))} 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go