MST

星途 面试题库

面试题:Go语言中实参与形参传递的基础机制

在Go语言中,当函数传递切片(slice)作为参数时,是按值传递还是按引用传递?请解释原因,并举例说明传递后对原切片的影响。
25.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,函数传递切片(slice)作为参数时,是按值传递的。

虽然切片本身是一个引用类型,但传递给函数时,传递的是切片结构体的副本。这个切片结构体包含指向底层数组的指针、切片的长度和容量。

当切片作为参数传递给函数时,函数内部对切片的修改可能会影响原切片,这是因为函数内和函数外的切片结构体指向同一个底层数组。然而,如果函数内对切片进行了重新切片(改变了长度或容量)或者重新赋值(指向了新的底层数组),原切片不受影响。

示例代码如下:

package main

import "fmt"

func modifySlice(s []int) {
    s[0] = 100 // 修改切片的第一个元素
    s = append(s, 4) // 重新切片并追加一个元素
}

func main() {
    originalSlice := []int{1, 2, 3}
    fmt.Println("Original slice:", originalSlice)

    modifySlice(originalSlice)
    fmt.Println("After modification:", originalSlice)
}

在上述代码中,modifySlice 函数修改了切片的第一个元素,这会影响原切片。但是,当使用 append 函数重新切片并追加元素时,原切片并未受到影响。输出结果为:

Original slice: [1 2 3]
After modification: [100 2 3]

可以看到,第一个元素被修改为 100,但追加的元素 4 并没有出现在原切片中。这是因为 append 操作可能会导致切片重新分配内存,从而创建一个新的底层数组,而原切片依然指向旧的底层数组。