Golang 中指针和值传递是如何实现的?

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等)可以传值也可以传指针

值传递只是复制一个副本。
指针传递让形参和实参指向同一块内存。
通过选择传值还是传指针,可以控制函数对参数的影响程度。