Golang中值传递和指针传递实现如下:
一、值传递
func swap(x, y int) {
x, y = y, x // 修改的是副本
}
a, b := 3, 4
swap(a, b)
fmt.Println(a, b) // a=3, b=4
把实际参数复制一份传递给形参。
形参对实参没有影响。
二、指针传递
func swap(x, y *int) {
temp := *x
*x = *y
*y = temp
}
a, b := 3, 4
swap(&a, &b)
fmt.Println(a, b) // a=4, b=3
通过指针访问实际参数,实现交换。
三、区别
- 值传递只是把值复制一份给形参
- 指针传递让形参和实参指向同一块内存
- 值传递速度快,拷贝开销小
- 指针传递可以修改实际参数
- 值类型只能传值
- 引用类型可以传值也可以传指针
总的来说, Golang 中:
- 值类型(int string等)只能传值
- 引用类型(结构体 指针 slice等)可以传值也可以传指针
值传递只是复制一个副本。
指针传递让形参和实参指向同一块内存。
通过选择传值还是传指针,可以控制函数对参数的影响程度。