在golang中通过引用传递数组

iam*_*lam 6 arrays go

我来自C背景并在C风格中传递数组导致错误.

请帮助

package main
import "fmt"

func f(a *int){
  fmt.Println(a[1])
}

func main(){
  var a [100]int
  a[1]=100
  f(a)
}
Run Code Online (Sandbox Code Playgroud)

Error :: 不能在f的参数中使用a(type [100] int)作为类型*int

jxs*_*ord 8

正如其他人在评论中提到的那样,您可能希望使用切片而不是数组.切片已通过引用传递,因此无需指定指针.make下面的语句创建了一个int(由数组支持).在下面的代码中,我给它的长度为2,容量为100,以满足您分配索引1的目标.

import (
    "fmt"
)

func f(a []int) {
    fmt.Println(a[1])
}

func main() {
    a := make([]int, 2, 100)
    a[1] = 100
    f(a)
}
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,切片是按值传递的,但它们的值只是一个长度和一个指向数组的指针。 (7认同)
  • 是的,甚至切片也是按值传递的。作为切片将包含指向数组的指针。函数内部修改的数据会影响实际的数组 (2认同)

Aks*_*hot 7

要回答最初的问题,您可以传递一个指向数组的指针,以通过引用传递数组。

\n\n

例如,以下函数更改包含 3 个整数的数组的内容。

\n\n
func change(ptr *[3]int) {\n    ptr[2] = 20\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以通过传递指向原始数组的指针来调用它:

\n\n
change(&arr)\n
Run Code Online (Sandbox Code Playgroud)\n\n

完整示例

\n\n
package main\n\nimport (\n    "fmt"\n)\n\nfunc main() {\n    grades := [3]int {1, 2, 3}\n\n    fmt.Printf("\\nOriginal array:\\n")\n    for i, v := range grades {\n        fmt.Printf("arr[%d] = %d\\n", i, v)    // prints 1 2 3\n    }\n\n    change(&grades)\n    fmt.Printf("\\nModified grades:\\n")\n    for i, v := range grades {\n        fmt.Printf("arr[%d] = %d\\n", i, v)    // prints 1 2 20\n    }\n}\n\nfunc change(ptr*[3]int) {\n    ptr[2] = 20\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在您的示例中,f需要一个指向整数的指针,

\n\n
func f(a *int)    // a points to an integer\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你向它传递一个数组,

\n\n
var a [100]int\nf(a)\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此它给了你错误cannot use a (type [100]int) as type *int in argument to f

\n\n

尽管将指针传递给数组是有效的,并且允许被调用的函数更改 caller\xe2\x80\x99s 变量,但数组的大小仍然是固定的。因此,建议使用切片,切片通过引用传递并且大小是动态的。

\n