
Go 中声明指针变量(如 var p *string)默认初始化为 nil,此时不能直接通过 *p = value 赋值,否则触发运行时 panic;必须先让指针指向有效内存地址(如取已有变量地址或用 new() 分配)。
go 中声明指针变量(如 `var p *string`)默认初始化为 `nil`,此时不能直接通过 `*p = value` 赋值,否则触发运行时 panic;必须先让指针指向有效内存地址(如取已有变量地址或用 `new()` 分配)。
在 Go 中,指针变量的声明本身不分配其所指向的内存——它只分配一个存储“地址”的空间。当你写下:
var b *string
编译器会创建一个类型为 *string 的变量 b,并将其初始化为零值 nil(即空指针)。此时 b 不指向任何有效内存位置,因此对 *b 的任何读写操作(如 *b = "bar")都会导致运行时 panic:
panic: runtime error: invalid memory address or nil pointer dereference
✅ 正确做法是:在解引用前,确保指针已初始化为非-nil 值。有以下两种常用方式:
1. 指向已有变量的地址(最常见)
var c string = "bar" b := &c // b 现在指向 c 的内存地址 *b = "world" // ✅ 合法:修改 c 的值 fmt.Println(c) // 输出 "world"
2. 使用 new() 分配新内存
b := new(string) // 分配一个 *string,内部 string 初始化为 ""(零值) *b = "hello" // ✅ 合法:修改新分配的 string 值 fmt.Println(*b) // 输出 "hello"
⚠️ 注意事项:
- new(T) 返回 *T,且所指向的 T 值被初始化为 T 的零值(如 string → "",int → 0);
- &variable 只能用于可寻址的变量(不能是字面量、函数返回值等临时值),例如 &"hello" 是非法的;
- 指针赋值 b = &c 是将地址拷贝给 b,后续 *b = x 实质是修改 c 本身——二者共享同一块内存。
? 总结:Go 指针安全的核心原则是——先初始化,再解引用。永远不要跳过让指针“落地”(指向有效内存)这一步。这是理解 Go 内存模型与避免崩溃的关键基础。

















