1 回答
TA贡献1830条经验 获得超9个赞
答案,也是主要的问题原因,是当参数传递给函数或分配给变量时, Go总是使用按值传递(或值的副本)。
您的函数F需要一个arr参数:
func F(arr interface{}) {
//...
}
当从您的main函数调用时,您将传递一个[]*Human指针作为参数,这些值将被复制并提供给您的函数F以供执行。
回到您的函数F体,arr将具有与 main 传递的相同值,这恰好是原始[]*Human结构的地址。在将新值分配给时arr:
func F(arr interface{}) {
switch arr.(type) {
case *[]*Human:
arr = &[]*Human{{Name: "abc"}}
// ...
}
}
您正在为局部变量而不是原始指针分配一个新值,该 arr指针实际上保持不变。
要更新参数指针指向的值,您应该使用dereferrence符号:
func F(arr interface{}) {
switch arr := arr.(type) {
case *[]*Human:
*arr = []*Human{&Human{Name: "abc"}}
fmt.Println(arr)
// ...
}
}
请注意switch arr := arr.(type)创建具有动态类型的新arr变量(隐藏参数arr)的语句,interface以便能够为其分配适当的值。
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报