Go中指针相等仅取决于是否指向同一内存地址或同为nil;==比较不关心值、内容或结构体字段,不同类型指针不可比较,零大小结构体指针可能因地址复用而意外相等。
Go 中两个指针相等,只看它们是否指向**同一块内存地址**,或是否都为 nil;值相同、结构体内容一样、甚至都是 &struct{}{},都不保证指针相等。
Go 允许直接用 == 或 != 比较同类型指针,但结果完全取决于底层地址是否一致:
p1 == p2 为 true 当且仅当 p1 和 p2 存储的是同一个地址(比如都指向变量 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:只在 p1 和 p2 是同一个结构体实例的地址时才为 true
*p1 == *p2:要求结构体所有字段可比较(不能含 []int、map[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{} 这类零大小变量的指针,在接口中比较时可能“意外相等”,哪怕它们来自不同调用:
&struct{}{} 多次调用返回的指针地址相同interface{},one == two 可能返回 true,但你根本没创建同一个对象byte 字段或注释字段即可)type fake struct{ _ [0]byte } // 非零大小,强制分配独立地址
// 而不是 type fake struct{} —— 危险!
函数名本身不可比较: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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。