登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-06 10:09:39 486浏览 收藏

今天golang学习网给大家带来了《为什么这段代码要求我在函数声明中包含数组的大小?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我试图将 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),没有错误并且运行。如果存在类型不匹配,我不明白为什么指定数组的大小有效。我见过几个不需要在函数中指定数组大小的示例,那么我缺少什么?


解决方案


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

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

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

fmt.println("sum: ", addthemnumbers(favnums[:]))

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

在函数参数中,您需要一个切片,但传递的是一个数组。

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

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

另外,请阅读slices上的这篇文章

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为什么这段代码要求我在函数声明中包含数组的大小?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>