&是go中获取变量内存地址的操作符,返回带类型的指针值,要求操作数必须可寻址,用于实现引用传递和安全解引用。

Go里的&不是魔法,它干的是一件很实在的事:告诉CPU“去内存里查这个变量住在哪”,然后把那个地址(比如0xc00001a0a8)原样取出来,作为值返回。
它拿到的是真实物理内存中的位置编号
每个变量在运行时都存放在RAM某个具体单元里,就像公寓楼里的房间。&a 就是查“a住几零几”,得到的是一串十六进制数字——这串数字就是该变量在当前进程虚拟地址空间里的起始位置。Go不暴露裸地址运算,但这个值本身是操作系统和硬件共同管理的真实定位标识。
它生成的是一个指针类型值,不是普通整数
虽然地址看起来像数字,但&a的结果类型是*int(假设a是int),不是uintptr或int64。这意味着:
它触发了变量的“地址可取性”检查
不是所有值都能用&取地址。只有“可寻址”的变量才行,比如:
- 命名变量:
a := 42; &a✅ - 结构体字段:
u.name(如果u是变量)✅ - 切片元素:
s[0]✅ - 但常量
&42、字面量&"hello"、函数调用结果&f()❌ 编译报错
这是因为这些值没有稳定内存位置,编译器无法分配或跟踪其地址。
它让指针传递成为可能
函数参数默认是值拷贝。&x把变量地址传进去,等于把“房间钥匙”交出去——被调函数就能用这把钥匙打开同一扇门,读或改原始数据。没有&,就只能操作副本,外部永远看不到变化。
基本上就这些。&不是语法糖,是Go连接变量和内存的硬接口,稳、准、有类型约束。