Passing array to a function in Go

huangapple go评论80阅读模式
英文:

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)
}

huangapple
  • 本文由 发表于 2021年5月25日 14:03:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/67682522.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定