在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。這僅修改函數內的副本,以及原始值nums 切片在函數外保持不變。
要解決此問題,您需要透過引用傳遞切片。一種方法是將指標傳遞給切片:
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 }
在這種情況下,驗證函數傳回修改後的訊息切片,無需將指標傳遞給該切片。
以上是如何修改 Go 中作為函數參數傳遞的切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!