- 值传递与引用传递概念
- 值传递:在值传递中,函数接收的是参数的副本。对副本的修改不会影响原始变量。
- 引用传递:引用传递时,函数接收的是参数的内存地址,对通过该地址访问的数据的修改会影响原始变量。
- 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
的副本。
- 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
函数中的切片都引用了同一个底层数组。