我有一些不同结构的数组,我需要通过相同的函数更改它们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)
我想你的问题是,即使你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)
| 归档时间: |
|
| 查看次数: |
3379 次 |
| 最近记录: |