Golang,用指针改变数组

时间:2017-11-02 05:45:33

标签: pointers go

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

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

然后我发现,我无法通过指针simple example为您更改数组。

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

1 个答案:

答案 0 :(得分:2)

我想你的问题是, 即使你在函数内部out = &arr, 调用者中的arr如何保持不变。

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

您似乎正在尝试做的事情是这样的:

*out = arr

即,更改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)
}