插件窝 干货文章 Go语言数组指针参数传递:值传递与指针传递究竟有何区别?

Go语言数组指针参数传递:值传递与指针传递究竟有何区别?

数组 传递 modifyArray 函数 731    来源:    2025-03-11

在Go语言中,数组作为参数传递给函数时,可以选择使用值传递或指针传递。这两种方式在行为上有显著的区别,主要体现在对原始数组的影响和性能上。

1. 值传递(Pass by Value)

当数组以值传递的方式传递给函数时,函数会接收到数组的一个副本。这意味着在函数内部对数组的任何修改都不会影响到原始数组。

示例代码:

package main

import "fmt"

func modifyArray(arr [3]int) {
    arr[0] = 100
    fmt.Println("Inside modifyArray:", arr)
}

func main() {
    arr := [3]int{1, 2, 3}
    modifyArray(arr)
    fmt.Println("After modifyArray:", arr)
}

输出:

Inside modifyArray: [100 2 3]
After modifyArray: [1 2 3]

解释:

  • modifyArray 函数接收的是数组 arr 的一个副本,因此在函数内部修改数组元素不会影响原始数组。
  • 原始数组 arr 在函数调用后保持不变。

2. 指针传递(Pass by Pointer)

当数组以指针传递的方式传递给函数时,函数会接收到数组的指针。这意味着在函数内部对数组的任何修改都会直接影响到原始数组。

示例代码:

package main

import "fmt"

func modifyArray(arr *[3]int) {
    arr[0] = 100
    fmt.Println("Inside modifyArray:", *arr)
}

func main() {
    arr := [3]int{1, 2, 3}
    modifyArray(&arr)
    fmt.Println("After modifyArray:", arr)
}

输出:

Inside modifyArray: [100 2 3]
After modifyArray: [100 2 3]

解释:

  • modifyArray 函数接收的是数组 arr 的指针,因此在函数内部修改数组元素会直接影响原始数组。
  • 原始数组 arr 在函数调用后被修改。

3. 性能考虑

  • 值传递:当数组较大时,值传递会导致整个数组的复制,这可能会带来较大的性能开销。
  • 指针传递:指针传递只传递数组的地址,避免了数组的复制,因此在处理大数组时性能更好。

4. 总结

  • 值传递:适用于小数组或不需要修改原始数组的场景。
  • 指针传递:适用于大数组或需要修改原始数组的场景。

5. 选择建议

  • 如果数组较小且不需要修改原始数组,可以使用值传递。
  • 如果数组较大或需要修改原始数组,建议使用指针传递。

通过理解这两种传递方式的区别,你可以根据实际需求选择合适的方式来传递数组参数。