英文:
Passing array to a function in Go
问题
func printArray(my_arr []int) { // 错误:无法将 arr(类型为 [8]int)作为 printArray 的参数类型 []int 使用
fmt.Println(len(my_arr))
}
func main() {
arr := [...]int{17,-22,15,20,33,25,22,19}
printArray(arr)
}
在C++中,我们通过引用传递数组给函数。在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)
}
As in C++ we pass the array in a function using pass by reference. can we do same in GoLang?
答案1
得分: 6
在Go语言中,数组元素是按值传递的,也就是说目标函数会得到传递的数组元素的副本。此外,[]int
表示的是int
的切片,而不是元素的数组。如果你想要传递数组的地址以实现传统的C语言行为,可以将数组作为地址传递给函数,如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)
}
切片在内部只是指向支持数组的指针,因此即使按值传递,对接收函数中切片的任何更改都会修改原始的支持数组,从而也会修改切片。
英文:
Array elements are passed by values in Go, i.e. the target function gets a copy of the array elements passed. Moreover, []int
refers to a slice of int
and not an array of elements. If you want the traditional C like behaviour, pass the array by its address as printArray(&arr)
and receive it as array *[8]int
.
But even this style isn't idiomatic Go. Use slices instead.
func printArray(arr []int){
fmt.Printf("%d\n", len(arr))
}
func main(){
arr := []int{17,-22,15,20,33,25,22,19}
printArray(arr)
}
A slice is internally just a pointer to the backing array, so even when its passed by value, any changes to the slice on the receiving function modifies the original backing array and therefore the slice also.
答案2
得分: 3
你的printArray(my_arr []int)
函数的参数期望是一个切片,而不是一个数组。在Go语言中,使用语法[...]{1,2,3}
可以创建一个拥有方括号中指定元素数量的数组。
注意:如果你没有特别的用例需要使用数组,请使用@inian的答案。
所以在这种情况下,有两种方法可以实现。
第一种方法
- 从数组中发送切片进行打印
package main
import "fmt"
func printArray(my_arr []int) {
fmt.Println(len(my_arr))
}
func main() {
arr := [...]int{17, -22, 15, 20, 33, 25, 22, 19}
printArray(arr[:])
}
第二种方法
- 在
printArray
函数中接受数组。 - 但是这种方法有一些限制,它只能接受长度为1的数组。在这个例子中,长度为8。
package main
import "fmt"
func printArray(my_arr [8]int) {
fmt.Println(len(my_arr))
}
func main() {
arr := [...]int{17, -22, 15, 20, 33, 25, 22, 19}
printArray(arr)
}
英文:
your printArray(my_arr []int)
function's parameter expecting a slice, not an array.
In Go, from syntax [...]{1,2,3}
creating an array with number of elements in the brackets.
NOTE: If you have not any use case specially with an array, please use @inian's answer.
So in this case, there is two ways to do this.
1st way
- send slice to print from the array
package main
import "fmt"
func printArray(my_arr []int) {
fmt.Println(len(my_arr))
}
func main() {
arr := [...]int{17, -22, 15, 20, 33, 25, 22, 19}
printArray(arr[:])
}
2nd way
- accept array in
printArray
function. - but this has some limitation, it will accept arrays with the one length. In this case it is 8.
package main
import "fmt"
func printArray(my_arr [8]int) {
fmt.Println(len(my_arr))
}
func main() {
arr := [...]int{17, -22, 15, 20, 33, 25, 22, 19}
printArray(arr)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论