面试题答案
一键面试在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
操作可能会导致切片重新分配内存,从而创建一个新的底层数组,而原切片依然指向旧的底层数组。