如何在Golang中理解指针比较_Golang地址比较与相等判断


Go中指针相等仅取决于是否指向同一内存地址或同为nil;==比较不关心值、内容或结构体字段,不同类型指针不可比较,零大小结构体指针可能因地址复用而意外相等。

Go 中两个指针相等,只看它们是否指向**同一块内存地址**,或是否都为 nil;值相同、结构体内容一样、甚至都是 &struct{}{},都不保证指针相等。

用 == 比较指针:只认地址,不认内容

Go 允许直接用 ==!= 比较同类型指针,但结果完全取决于底层地址是否一致:

  • p1 == p2true 当且仅当 p1p2 存储的是同一个地址(比如都指向变量 a),或两者都是 nil
  • 即使 *p1 == *p2 成立(值相等),p1 == p2 仍可能为 false —— 它们只是“长得像”,不是“同一个人”
  • 不同类型指针(如 *int*int64)无法直接比较,编译报错:mismatched types *int and *int64
func main() {
    a, b := 42, 42
    p1 := &a
    p2 := &b
    fmt.Println(p1 == p2) // false —— 不同变量,不同地址
    fmt.Println(*p1 == *p2) // true —— 值相同,但和指针比较无关
}

结构体指针比较:地址相等 ≠ 内容相等

对结构体指针使用 ==,比的是指针本身,不是它指向的字段。想比内容,必须解引用:

  • p1 == p2:只在 p1p2 是同一个结构体实例的地址时才为 true
  • *p1 == *p2:要求结构体所有字段可比较(不能含 []intmap[string]int 或函数),否则编译失败
  • 若结构体含指针字段(如 data *string),*p1 == *p2 仍只比指针地址,不比 *data 的值
type User struct {
    Name string
    Age  int
}
u1 := &User{"Alice", 30}
u2 := &User{"Alice", 30}
fmt.Println(u1 == u2) // false
fmt.Println(*u1 == *u2) // true —— 字段都可比较,且值相同

零大小结构体指针的“幻影相等”

这是最容易踩坑的冷知识:指向 struct{} 这类零大小变量的指针,在接口中比较时可能“意外相等”,哪怕它们来自不同调用:

  • Go 规范明确允许:指向不同零大小变量的指针“可能相等,也可能不相等”
  • 实际中,编译器常复用同一地址(因为不占空间),导致 &struct{}{} 多次调用返回的指针地址相同
  • 一旦包装进 interface{}one == two 可能返回 true,但你根本没创建同一个对象
  • 解决办法很简单:让结构体非零大小(加一个 byte 字段或注释字段即可)
type fake struct{ _ [0]byte } // 非零大小,强制分配独立地址
// 而不是 type fake struct{} —— 危险!

函数指针不能直接比较,得靠 reflect

函数名本身不可比较:someFunc == someFunc 编译失败,报错 func can only be compared to nil

  • 唯一合法的函数比较是 f == nil
  • 要判断两个函数是否是同一个实体,必须用 reflect.ValueOf(f).Pointer()
  • 注意:该地址是运行时函数入口地址,跨构建/热重载可能变化,不适用于持久化或网络传输
import "reflect"
func foo() {}
func bar() {}
fmt.Println(reflect.ValueOf(foo).Pointer() == reflect.ValueOf(foo).Pointer()) // true
fmt.Println(reflect.ValueOf(foo).Pointer() == reflect.ValueOf(bar).Pointer()) // false

真正难的不是写对 ==,而是意识到你在比什么——地址?值?语义唯一性?一旦把 == 当成“逻辑相等”用,尤其混入接口、零大小类型或函数,就很容易被 Go 的底层行为反向教育。


# go  # golang  # ai  # red  # String  # 结构体  # int  # 指针  # 接口  # Struct  # Interface  # pointer  # nil  # map  # 对象  # 的是  # 都是  # 报错  # 不同类型  # 装进  # 复用  # 这是  # 都不  # 你在  # 也可 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: PHP怎么接收前端传的时间戳_处理时间戳参数转换技巧汇总【指南】  全球各国上班时间表外贸邮件时间  Windows11怎么自定义任务栏_Windows11任务栏自定义教程【步骤】  Go 中实现 Python urllib.quote() 功能的等效方法  c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】  php删除数据怎么软删除_添加is_del字段标记删除【技巧】  Win10如何卸载微软拼音输入法 Win10只保留一个输入法【教程】  如何在 Go 结构体中正确初始化 map 字段  如何在Golang中使用replace替换模块_指定本地或远程路径  Win11怎么更改任务栏颜色_Windows11个性化重音色设置  Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】  MySQL 中使用 IF 和 CASE 实现查询字段条件化显示  Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用  Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】  mac怎么查看wifi密码_MAC查看已连接WiFi密码方法【技巧】  Mac的“预览”如何合并多个PDF_Mac文件处理技巧【效率】  php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】  LINUX怎么进行文本内容搜索_Linux grep命令正则表达式用法大全【教程】  Win11怎么设置触控板手势_Windows11三指四指操作自定义  如何在Golang中使用time处理时间_Golang time时间解析与格式化方法  php嵌入式多设备通信怎么实现_php同时管理多个串口设备【操作】  Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件  Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置  Windows电脑如何截屏?(四种快捷方法)  Win11怎么查看激活状态_查询Windows 11是否已永久激活【详解】  C#怎么创建控制台应用 C# Console App项目创建方法  如何使用Golang反射创建map对象_动态生成键值映射  如何在Golang中操作嵌套切片指针_Golang多维slice修改  Win11如何开启telnet服务 Win11启用Telnet客户端【步骤】  mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】  C#怎么使用委托和事件 C# delegate与event编程方法  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  c++ atoi和atof函数用法_c++字符数组转数字  Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程  Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值  Windows 10怎么把任务栏放在屏幕上方_Windows 10解锁任务栏并拖动位置  Win11怎样安装搜狗输入法_Win11安装搜狗输入法教程【步骤】  Win11怎么关闭通知中心_Windows11系统通知与专注助手设置  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】  C++如何解析JSON数据?(nlohmann/json库示例)  php后缀怎么变mp4能播放_让php伪装mp4正常播放的技巧【技巧】  Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程  php中常量能用::访问吗_类常量与作用域操作符使用场景【汇总】  Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】  Win11怎么开启游戏工具栏_Windows11 Xbox Game Bar快捷键  mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】  Windows10怎么备份注册表_Windows10注册表备份步骤【教程】  Win10怎么关闭自动更新错误弹窗_Win10策略屏蔽失败提示减少干扰【防护】  怎么将XML数据可视化 D3.js加载XML  Windows怎样拦截WPS弹窗广告_Windows拦截WPS弹窗广告设置【步骤】 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.