为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕田峪4524236 2022-06-01 10:59:51
我正在尝试将 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)没有错误并且它运行。如果存在类型不匹配,我不明白为什么指定数组的大小有效。我已经看到了几个不需要在函数中指定数组大小的例子,那么我错过了什么?
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

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

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

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

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


查看完整回答
反对 回复 2022-06-01
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

数组和切片之间有区别。我想你要找的是一片。

在函数参数中,您期望的是一个切片,而是传递了一个数组。

有两种方法可以快速处理它:

  1. 要删除类型不匹配,请在参数中提及大小,以便它现在接受一个数组(而不是切片)。

  2. 将数组转换为切片

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


查看完整回答
反对 回复 2022-06-01
?
12345678_0001

TA贡献1802条经验 获得超5个赞

实际上,当我们查看 []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[:]))


查看完整回答
反对 回复 2022-06-01
  • 3 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信