在 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中文网其他相关文章!