在Go 中,將參數傳遞給函數是按值完成的,這意味著對參數所做的任何更改函數內的內容不會反映在原始變數中。當使用可變資料類型(例如切片)時,這可能會出現問題,因為附加到函數內的切片不會影響超出函數範圍的原始切片。
考慮以下範例:
nums := []int{1, 2, 3} func addToNumbs(nums []int) []int { nums = append(nums, 4) fmt.Println(nums) // []int{1, 2, 3, 4} } fmt.Println(nums) // []int{1, 2, 3}
在此範例中,AddToNumbs 函數取得 nums 切片的副本並附加值 4。這僅修改其中的副本
要解決此問題,需要透過引用傳遞切片。一種方法是將指標傳遞給切片:
func myAppend(list *[]string, value string) { *list = append(*list, value) }
透過將指標傳遞給切片,函數內所做的任何變更都會直接反映在原始切片中。然而,傳遞指標也意味著函數可以以您可能意想不到的方式修改切片,因此謹慎使用指標非常重要。
另一種選擇是從函數傳回修改後的切片,如圖所示在以下範例中:
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { // Append to the accumulator and return it directly messages = append(messages, message) return messages }
在這種情況下,驗證函數會傳回修改後的訊息切片,因此無需將指標傳遞給切片。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3