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 關注
- 127 瀏覽
添加回答
舉報