arrays - 为什么这段代码要求我在函数声明中包含数组的大小?
问题描述
我正在尝试将 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[:]))
推荐阅读
- android - Android房间架构关系
- jquery - 播放通知声音时未捕获(承诺)DOMException
- javascript - 是否可以像普通函数一样组合生成器函数
- java - 如何通过蓝牙将 Android 应用程序连接到 ESP32?
- google-apps-script - 如何获取项目中所有功能的列表?
- php - 使用 db_query 时打开和关闭连接
- java - 关于运行时常量池或堆中String的一些问题?
- node.js - Angular7:拦截器没有被击中的问题,无法弄清楚
- ios - 修复自定义相机应用程序 iOS 的方向
- jenkins - 如何使用属性文件中的值为 jenkins 节点赋值