Golang 中引用类型和值类型有何区别?

Go语言中的类型主要可以分为:值类型和引用类型。
值类型(value type):

  • 布尔型
  • 数字
  • 字符串

引用类型(reference type):

  • 切片
  • 地址
  • 指针
  • 映射
  • 通道
  • 函数
  • 接口
  • 数组
  • 结构体

它们的区别主要在于:
值类型:

  • 直接保存实际的值
  • 当复制时,会生成一个新的副本
  • 在修改时,不会影响其他副本

引用类型:

  • 保存指向实际值的指针
  • 当复制时,只是复制指针,不是实际值
  • 在修改时,会影响所有其他副本

举个例子:

a := 10 // 值类型
b := a 
b++
fmt.Println(a, b) // 10 11

s := []int{1, 2, 3} // 引用类型
t := s
t[0] = 0
fmt.Println(s, t) // [0 2 3] [0 2 3]

可以看出:

  • 数值类型a的修改不影响b
  • 切片类型s的修改会影响t

因为数值类型直接复制了值,而切片只是复制了指针。

总的来说,Go语言的引用类型与值类型的区别主要在于:

  • 值类型保存实际值
  • 引用类型保存指针
  • 值类型修改不影响其他副本
  • 引用类型修改会影响所有副本

理解这两种类型的区别,可以更好地选择数据类型,避免程序 bug。