Golang,通过指针改变数组

Sky*_*.Li 1 pointers go

我有一些不同结构的数组,我需要通过相同的函数更改它们func foo(arr interface{})。

我以这种方式使用该功能foo(&arrayToChange)

然后我发现,我无法通过指针更改数组,这是一个简单的例子。

package main

import (
    "fmt"
)

func A(out interface{}) {
    arr := make([]interface{}, 0)
    arr = append(arr, "foo", 2.2)
    out = &arr
    B(out)
}

func B(out interface{}) {
    arr := make([]interface{}, 0)
    arr = append(arr, "bar", "foo", "anything")
    out = &arr
}

func main() {
    arr := make([]interface{}, 0)
    arr = append(arr, 1, 2, 3)
    fmt.Printf("%T\n", &arr)
    A(&arr)
    fmt.Println(arr)
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

我想你的问题是,即使你out = &arr在函数内部做了,arr调用者的方式也没有改变。

out是函数中的局部变量。您传递给该函数&arr,因此 的值out是 的地址arr。然后你将 的值更改out为其他值。这不会影响该函数范围之外的任何内容。重新分配局部变量的值不会影响函数范围之外的任何内容。

看起来你想要做的事情是这样的:

*out = arr
Run Code Online (Sandbox Code Playgroud)

即改变out指向的值。

package main

import (
    "fmt"
)

func A(out *[]interface{}) {
    arr := make([]interface{}, 0)
    arr = append(arr, 1, 2)
    *out = arr
}

func main() {
    arr := make([]interface{}, 0)
    arr = append(arr, 1, 2, 3)
    fmt.Printf("%T\n", &arr)
    A(&arr)
    fmt.Println(arr)
}
Run Code Online (Sandbox Code Playgroud)