首页 >后端开发 >Golang >如何修改在 Go 函数中作为参数传递的切片?

如何修改在 Go 函数中作为参数传递的切片?

Barbara Streisand
Barbara Streisand原创
2024-12-23 07:30:43981浏览

How Can I Modify a Slice Passed as an Argument in a Go Function?

将切片作为带有原始切片修改的参数传递

Go 中按值传递变量限制了函数修改对函数作用域的影响。如果需要在函数外部修改切片,则直接将切片作为参数传递是不够的。

切片追加函数行为

追加函数分配一个新切片并复制现有切片中的元素,包括函数内进行的任何附加。但是,原始切片不受影响。

示例:累积切片上的递归

提供的代码片段最初尝试在作为参数传递的切片中累积验证消息到一个递归函数。但是,函数的修改不会反映在原始切片中。

解决方案

此问题的解决方案主要有两种:

  1. 将指针传递给切片:通过将指针传递给原始切片,函数内所做的任何修改将直接影响原始切片。
func myAppend(list *[]string, value string) {
    *list = append(*list, value)
}
  1. 从函数返回修改后的切片:递归函数可以返回修改后的切片,而不是传递累加器,无需传递累加器
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage {
    //...Processing

    return messages
}

惯用的 Go 方法

当函数需要修改原始切片时,将指针传递给切片是一种惯用的 Go 方法。正如返回切片方法所示,还可以通过返回修改后的切片来避免对累加器的需求。

性能注意事项

传递 a 的性能影响在大多数情况下,指针与返回切片的关系可以忽略不计。但是,具体行为可能会有所不同,具体取决于编译器优化和特定代码使用情况。

以上是如何修改在 Go 函数中作为参数传递的切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn