在 Go 中傳遞 map 給函數時,預設會建立副本,對副本的修改不影響原始 map。如果需要修改原始 map,可透過指標傳遞。空 map 要小心處理,因為技術上是 nil 指針,傳遞空 map 給期望非空 map 的函數會發生錯誤。
Go 函數接收map 參數時的注意事項
在Go 中,傳遞map 給函數作為參數時,存在著一些注意事項,如果不加以注意,可能會導致意想不到的結果。
副本傳遞
當將 map 傳遞給函數時,預設會建立一個副本。也就是說,函數內的 map 是該參數 map 的副本,副本所做的任何修改都不會影響原始 map。
實戰案例 1:
func modifyMap(m map[string]int) { m["key"] = 100 } func main() { m := make(map[string]int) modifyMap(m) fmt.Println(m) // 输出:{} }
如範例所示,modifyMap
函數對 map 所做的修改不會影響原始 map。
避免副本傳遞
如果需要修改原始 map,可以使用指標來傳遞。當傳遞指標時,函數內的 map 指向原始 map 的記憶體位址。
實戰案例 2:
func modifyMap(m *map[string]int) { (*m)["key"] = 100 } func main() { m := make(map[string]int) modifyMap(&m) fmt.Println(m) // 输出:{key: 100} }
如範例所示,modifyMap
函數對 map 所做的修改會影響原始 map。
空 map
傳遞空 map 給函數時,需要小心。空 map 在技術上來說是一個 nil 指針,而並非一個有效 map。因此,如果函數期望非空 map,則在傳遞空 map 時可能會發生錯誤。
實戰案例 3:
func printMap(m map[string]int) { for k, v := range m { fmt.Println(k, v) } } func main() { var m map[string]int // 空 map printMap(m) // 运行时错误:panic: runtime error: invalid memory address or nil pointer dereference }
如範例所示,傳遞空 map 給函數會導致執行時間錯誤。要解決此問題,可以對 map 進行非空檢查,或提供一個預設值。
結論:
以上是Golang 函數接收 map 參數時的注意事項的詳細內容。更多資訊請關注PHP中文網其他相關文章!