MST

星途 面试题库

面试题:Go数组在函数传递中的特性及优化

在Go语言中,数组作为参数传递给函数时会发生什么?请举例说明如何在函数传递数组时避免性能损耗,例如在处理大数组时,怎样优化以减少内存复制开销。
21.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 数组作为参数传递给函数时的情况: 在Go语言中,数组作为参数传递给函数时,传递的是数组的副本,即整个数组会被复制一份传递给函数。这意味着如果数组很大,会有较大的性能损耗,因为复制大量数据需要消耗时间和内存。

    示例代码:

    package main
    
    import "fmt"
    
    func modifyArray(arr [3]int) {
        arr[0] = 100
    }
    
    func main() {
        original := [3]int{1, 2, 3}
        modifyArray(original)
        fmt.Println(original)
    }
    

    在上述代码中,modifyArray函数接收一个数组参数,在函数内部对数组的修改不会影响到原始数组,因为传递的是副本。

  2. 避免性能损耗的方法

    • 使用切片:切片是对数组的一个引用,它本身只包含一个指向底层数组的指针、长度和容量信息。当切片作为参数传递时,传递的只是这些少量信息,而不是整个底层数组,从而避免了大量数据的复制。

    示例代码:

    package main
    
    import "fmt"
    
    func modifySlice(slice []int) {
        slice[0] = 100
    }
    
    func main() {
        original := []int{1, 2, 3}
        modifySlice(original)
        fmt.Println(original)
    }
    

    在这个例子中,modifySlice函数接收一个切片参数,对切片的修改会影响到原始切片,因为它们指向同一个底层数组,并且切片作为参数传递时不会复制大量数据,适用于处理大数组的情况。

    • 使用指针:也可以传递数组指针,这样函数内部操作的是原始数组,而不是副本。

    示例代码:

    package main
    
    import "fmt"
    
    func modifyArrayPtr(arr *[3]int) {
        (*arr)[0] = 100
    }
    
    func main() {
        original := [3]int{1, 2, 3}
        modifyArrayPtr(&original)
        fmt.Println(original)
    }
    

    这里modifyArrayPtr函数接收一个数组指针,通过指针可以直接修改原始数组,避免了数组副本的创建,减少了内存复制开销。