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

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

数组 modifyArray 传递 函数 1151    来源:    2025-03-13

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

1. 值传递

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

示例代码:

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在函数调用后保持不变。

2. 指针传递

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

示例代码:

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,因此函数调用后原始数组的内容发生了变化。

3. 性能考虑

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

4. 总结

  • 值传递:函数内部对数组的修改不会影响原始数组,适用于不需要修改原始数组的场景。
  • 指针传递:函数内部对数组的修改会直接影响原始数组,适用于需要修改原始数组的场景,并且在处理大数组时性能更优。

根据具体需求选择合适的传递方式,可以有效提升代码的性能和可维护性。