将数组传递给 Go 中的函数

ujj*_*sal 3 arrays go

func printArray(my_arr []int){  // ERROR: cannot use arr (type [8]int) as type []int in argument to printArray
   fmt.Println(len(my_arr))
}
func main(){
    arr := [...]int{17,-22,15,20,33,25,22,19}
    printArray(arr)
}
Run Code Online (Sandbox Code Playgroud)

与在 C++ 中一样,我们使用引用传递在函数中传递数组。我们可以在 Go 中做同样的事情吗?

Ini*_*ian 9

在 Go 中,数组元素通过值传递,即目标函数获取传递的数组元素的副本。此外,[]int指的是元素的切片int不是元素的数组。如果您想要类似传统 C 的行为,请按数组地址 as 传递数组printArray(&arr),并以 形式接收它array *[8]int

但即使这种风格也不是 Go 的惯用风格。使用切片代替。

func printArray(arr []int){   
   fmt.Printf("%d\n", len(arr))
}

func main(){
    arr := []int{17,-22,15,20,33,25,22,19}
    printArray(arr)
}
Run Code Online (Sandbox Code Playgroud)

切片在内部只是指向后备数组的指针,因此即使按值传递,接收函数上对切片的任何更改都会修改原始后备数组,因此也会修改切片。