Go 不支持用 {} 语法直接初始化标量类型(如 int)的指针,但可通过取地址操作符 & 简洁地将变量地址赋给指针变量,实现声明与初始化一步完成。
go 不支持用 `{}` 语法直接初始化标量类型(如 `int`)的指针,但可通过取地址操作符 `&` 简洁地将变量地址赋给指针变量,实现声明与初始化一步完成。
在 Go 中,指针的初始化方式与复合类型(如结构体、切片、映射)有本质区别:标量类型的指针无法使用复合字面量(即 {} 语法)初始化,因为该语法仅适用于复合类型(composite types),而 *int 是一个独立的指针类型,其底层值是内存地址,不是可“构造”的复合结构。
✅ 正确且惯用的做法是:先声明并初始化一个普通变量,再用取地址操作符 & 获取其地址,直接赋值给指针变量:
package main
import "fmt"
func main() {
x := 5 // 类型推导为 int
y := &x // 类型推导为 *int;y 指向 x 的内存地址
fmt.Println(x) // 输出: 5
fmt.Println(*y) // 输出: 5(解引用)
fmt.Printf("%p\n", y) // 输出 x 的内存地址(例如:0xc0000140a0)
}⚠️ 注意:以下写法是错误或不可行的:
- ❌ var y *int = new(int){x}:new(int) 返回 *int,不是类型,不能跟 {} 复合字面量(编译报错:new(int) is not a type);
- ❌ x, y := 5, &x:Go 的短变量声明中,所有变量必须在声明前已完全确定作用域和值;&x 在同一语句中引用尚未完成声明的 x,会导致编译错误(undefined: x);
- ❌ var y *int = &5:字面量 5 是无地址的临时值(not addressable),Go 禁止对其取地址(编译报错:cannot take the address of 5)。
✅ 替代方案(显式声明,适合需要明确类型或延迟初始化的场景):
var x int = 42 var y *int = &x // 合法:&x 是合法的可寻址表达式
? 小结:
- Go 强调简洁性与安全性,标量指针初始化应优先使用 := + & 组合;
- 所有被取地址的变量必须是可寻址的(addressable)——即具有稳定内存位置的变量(如命名变量、结构体字段、切片元素等),而非字面量或函数返回值(除非明确返回地址);
- 若需动态分配并初始化,可先用 new(T) 分配零值,再单独赋值:
p := new(int) // p 指向一个值为 0 的 int *p = 100 // 显式写入目标值
掌握这一模式,能写出更符合 Go 语言哲学的清晰、安全、高效的指针代码。


















