指针相等通过比较内存地址实现,使用==或!=操作符判断;两个指针指向同一地址(包括均为nil)时相等,否则不等。示例中p1与p2因指向同一变量a的地址而相等,p3指向b故与p1不等;结构体含指针时需注意仅当指针地址相同才被视为相等,切片、map等复合类型的内容比较不能直接用==,须手动解引用或用reflect.DeepEqual;常见误区包括误认为值相同则地址相同,但Go中每个变量有独立内存空间,new()每次返回新地址,局部变量、字面量地址不复用,函数返回栈地址会导致错误;可通过fmt.Printf("%p", ptr)打印地址辅助调试,核心原则是“比较地址而非值”。

在Golang中判断两个指针是否相等,是通过比较它们指向的内存地址来实现的。如果两个指针变量保存的是同一个地址,那么它们就相等。理解这一点对于正确使用指针对比至关重要。
指针相等的基本规则
Go语言允许使用==和!=操作符直接比较两个指针。只有当两个指针指向同一块内存地址时,==才会返回true。这包括以下几种情况:
- 两个指针都为nil,此时它们被视为相等
- 两个指针指向同一个变量的地址
- 两个指针通过多次赋值或取地址操作最终指向相同位置
示例代码:
a := 42
b := 42
p1 := &a
p2 := &a // 同一个变量的地址
p3 := &b // 不同变量,即使值相同
fmt.Println(p1 == p2) // true
fmt.Println(p1 == p3) // false
fmt.Println(p1 == nil) // false
结构体与切片中的指针比较
当结构体字段包含指针时,比较结构体是否相等不会自动比较指针指向的内容,而是比较指针本身的地址。若想比较内容,需手动解引用或使用reflect.DeepEqual。
立即学习“go语言免费学习笔记(深入)”;
- 直接用==比较含有指针的结构体,仅当所有字段(包括指针地址)完全一致时才为真
- 切片、map本身不可比较,因此包含它们的指针也不能用==判断是否“内容相等”
注意:两个指向相同底层数组的切片指针,如果地址相同,则指针相等;否则即使内容一样也不相等。
常见误区与注意事项
开发者常误以为值相同的变量其地址也相同,但在Go中每个变量有独立内存空间。例如局部变量每次声明都会分配新地址。
- 不要假设字面量或临时值的地址会复用
- 函数返回的局部变量地址会导致错误(栈内存已释放)
- 使用new()创建的对象每次调用都会返回不同地址
小技巧:可通过打印fmt.Printf("%p", ptr)查看指针地址,辅助调试。
基本上就这些。Go的指针比较简单直接,关键是搞清“比较的是地址,不是值”。只要记住这一点,就能避免大多数问题。










