Go中无严格引用类型,区分关键在于底层是否含指针及是否深拷贝:基本类型、数组、struct为值类型;slice、map、chan、interface、func表现类似引用;自定义类型行为取决于字段组成。
在 Go 语言中,**没有严格意义上的“引用类型”概念**,但确实存在值传递语义下表现类似引用行为的类型。区分的关键不在于类型本身被归类为“值”或“引用”,而在于它的底层数据结构是否包含指针字段、是否在赋值/传参时发生深拷贝。理解这一点,才能真正掌握内存分配和拷贝行为。
基本类型(int、float64、bool、string)、数组([3]int)、结构体(struct)默认按值传递:每次赋值或函数传参时,会复制整个底层数据。
切片([]T)、映射(map[K]V)、通道(chan T)、接口(interface{})、函数(func())这些类型变量本身是小结构体(通常 2–3 个指针/整数字段),赋值时只拷贝这些元
信息,它们指向的底层数据(如 slice 的底层数组、map 的哈希表)仍被多个变量共享。
结构体是否“像引用”,取决于它是否包含上述“表现像引用”的字段。例如:
type MySlice struct {
data []int // 包含 slice 字段 → 赋值时共享底层数组
name string // string 字段 → 共享只读数据,不触发底层数组拷贝
}
type Point struct {
X, Y int // 纯基本类型 → 完全值拷贝
}
当希望避免拷贝或允许函数修改原始值时,统一方案是传指针(*T)。这适用于任何类型,包括 slice、map —— 即使它们已有引用语义,传指针仍可让你修改变量本身(比如让 slice 指向新底层数组)。