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。