我有一些不同结构的数组,我需要用相同的函数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)
}
答案 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)
}