1. 概述
在Go
语言中,函数的参数的传递类型,分为值传递和引用传递。但本质就只有值传递,引用传递本质传递是数据存储空间的地址值。
2. 值传递和引用传递
Go语言中如下数据类型为值传递:
- 基本数据类型中int系列、float系列、bool、string、byte
- 数组
- 结构体
注意:上述的数据类型,在分配内存的时候,使用的是new
函数。
如下数据类型为引用传递:
- map
- 切片slice
- 管道chan
- interface
- 函数类型
- 所有数据类型的指针类型
注意:map、slice、chan在分配内存的时候,使用的是make
函数。
也就是说:值类型的内存空间使用new来分配,引用数据类型的空间使用的是make来分配。
3. 值传递和引用传递的特点
值传递和引用传递的特点如下:
- 值类型默认是值传递,变量直接存储值,内存通常在占中分配
- 引用数据类型默认是引用传递,变量存储的是一个地址值,这个地址对应的空间才为存储数据的地址。内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的空间就成为一个垃圾,由GC来回收。