MST

星途 面试题库

面试题:Go数组与切片在函数传参时的行为差异

当将Go语言中的数组和切片作为参数传递给函数时,它们的行为有哪些显著差异?请结合值传递和引用传递的概念进行解释,并举例说明可能导致的不同结果。
27.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 值传递与引用传递概念
    • 值传递:在值传递中,函数接收的是参数的副本。对副本的修改不会影响原始变量。
    • 引用传递:引用传递时,函数接收的是参数的内存地址,对通过该地址访问的数据的修改会影响原始变量。
  2. Go语言数组作为参数传递
    • 行为:Go语言中数组作为参数传递时是值传递。这意味着函数接收的是数组的副本,而不是原始数组的引用。
    • 示例
package main

import "fmt"

func modifyArray(arr [3]int) {
    arr[0] = 100
    fmt.Println("在modifyArray函数中,数组:", arr)
}

func main() {
    originalArray := [3]int{1, 2, 3}
    modifyArray(originalArray)
    fmt.Println("在main函数中,数组:", originalArray)
}
  • 结果分析:在modifyArray函数中修改arr数组的第一个元素为100,但是在main函数中打印originalArray时,其值并未改变。这是因为modifyArray函数操作的是originalArray的副本。
  1. Go语言切片作为参数传递
    • 行为:Go语言中切片作为参数传递时,虽然语法上看起来像值传递,但实际上传递的是切片的描述符(包含指向底层数组的指针、切片的长度和容量),所以可以看作是类似引用传递。对切片的修改会影响到底层数组,进而影响到所有引用该底层数组的切片。
    • 示例
package main

import "fmt"

func modifySlice(slice []int) {
    slice[0] = 100
    fmt.Println("在modifySlice函数中,切片:", slice)
}

func main() {
    originalSlice := []int{1, 2, 3}
    modifySlice(originalSlice)
    fmt.Println("在main函数中,切片:", originalSlice)
}
  • 结果分析:在modifySlice函数中修改slice切片的第一个元素为100,在main函数中打印originalSlice时,其值也变为了[100, 2, 3]。这是因为modifySlice函数和main函数中的切片都引用了同一个底层数组。