在 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