一、Go 语言中的值类型和引用类型
- 值类型:基本数据类型(如 int系列、float系列、bool、string)和数组、结构体(struct)
- 引用类型:切片(slice)、映射(map)、通道(channel)、接口(interface)和函数(function)。
二、值类型和引用类型的区别
-
值类型:当你将一个值类型赋值给另一个变量时,会创建一个新的副本,两个变量互不影响。
-
引用类型:当你将一个引用类型赋值给另一个变量时,两个变量指向同一个底层数据结构,对其中一个变量的修改会影响另一个变量。
三、值类型和引用类型在内存中的表现
-
值类型:直接存储数据值,通常分配在栈上。(并不是绝对的,因为 go 语言的逃逸机制可能会改变这一行为)
-
引用类型:存储一个指向底层数据结构的指针,指针指向的空间才是真正存储的数据。 且该数据通常分配在堆上。当没有变量引用这个地址时,就会被垃圾回收机制回收。
四、内存中栈区和堆区的区别:
-
栈区:存储函数调用时的局部变量和参数,具有后进先出(LIFO)的特点,分配和回收速度快,但空间较小。
-
堆区:用于动态分配内存,大小不固定,分配和回收相对较慢,但空间较大。