Go 的 reflect 可实现可配置深度比较器,支持忽略字段、调用 Equal 方法、浮点容差比较等;而 reflect.DeepEqual 不支持这些定制,且对函数、NaN、不可比较 map 键值会 panic。
用 Go 的 reflect 写通用深度比较函数,核心是递归遍历两个值的结构,逐字段或逐元素比对。标准库的 reflect.DeepEqual 已经做了这件事,但若需自定义行为(比如忽略某些字段、处理 NaN、支持自定义 Equal 方法、跳过未导出字段等),就得自己实现。
它能处理大多数情况:结构体、切片、map、指针、接口、基本类型等。但它不处理:
Equal(other T) bool 方法(即使存在)关键思路:用 reflect.Value 获取值的种类(Kind),按类型分治处理,并支持选项控制行为。
基础骨架如下:
type Comparer struct {
ignoreFields map[string]bool
useEqualMethod bool
skipUnexported bool
}
func (c *Comparer) Equal(a, b interface{}) bool {
return c.equalValu
e(reflect.ValueOf(a), reflect.ValueOf(b))
}
func (c *Comparer) equalValue(v1, v2 reflect.Value) bool {
// 处理零值、不同 Kind、不同类型等前置检查
if v1.Kind() != v2.Kind() {
return false
}
if !v1.IsValid() || !v2.IsValid() {
return v1.IsValid() == v2.IsValid()
}
switch v1.Kind() {
case reflect.Struct:
return c.equalStruct(v1, v2)
case reflect.Slice, reflect.Array:
return c.equalSlice(v1, v2)
case reflect.Map:
return c.equalMap(v1, v2)
case reflect.Ptr:
return c.equalPtr(v1, v2)
case reflect.Interface:
return c.equalInterface(v1, v2)
case reflect.Float32, reflect.Float64:
return c.equalFloat(v1, v2)
default:
return v1.Interface() == v2.Interface()
}
}
结构体字段跳过:遍历字段前检查字段名是否在 ignoreFields 中;同时可通过 struct tag(如 json:"-" or diff:"skip")动态控制。
支持 Equal 方法:若任一值有 Equal(interface{}) bool 方法,优先调用它(需确保参数类型兼容)。
浮点数容差比较:不直接用 ==,改用 math.Abs(a-b) ,尤其对 NaN 单独判断(math.IsNaN)。
指针解引用策略:默认解引用比较(nil 指针视为相等),也可提供选项保留指针身份比较(即地址相同才等)。
v.IsValid() 检查,避免 panic(如 nil 接口、空指针解引用)v.Type().Field(i) 获取 tagmap[uintptr]bool 记录已访问地址)基本上就这些。写一个够用的通用比较器不复杂,但容易忽略循环引用、NaN、方法调用一致性等细节。从 reflect.DeepEqual 源码入手读一遍,再按需扩展,是最稳妥的路径。
# js
# json
# go
# golang
# 栈
# switch
# 标准库
# math
# 结构体
# 递归
# bool
# 循环
# 指针
# 接口
# Struct
# Interface
# float32
# 空指针
# 切片
# nil
# map
# kind
# 遍历
# 跳过
# 自定义
# 几个
# 浮点
# 也可
# 一遍
# 这件事
# 就得
相关文章:
建站主机数据库如何配置才能提升网站性能?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
宝塔新建站点报错如何解决?
山东云建站价格为何差异显著?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
如何访问已购建站主机并解决登录问题?
建站之星收费标准详解:套餐费用及年费价格表一览
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
建站主机功能解析:服务器选择与快速搭建指南
制作农业网站的软件,比较好的农业网站推荐一下?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何通过FTP空间快速搭建安全高效网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何用美橙互联一键搭建多站合一网站?
如何安全更换建站之星模板并保留数据?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
公众号网站制作网页,微信公众号怎么制作?
制作表格网站有哪些,线上表格怎么弄?
利用JavaScript实现拖拽改变元素大小
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
建站主机服务器选购指南:轻量应用与VPS配置解析
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何快速重置建站主机并恢复默认配置?
如何彻底删除建站之星生成的Banner?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
公司门户网站制作流程,华为官网怎么做?
网站设计制作企业有哪些,抖音官网主页怎么设置?
网站制作的步骤包括,正确网址格式怎么写?
油猴 教程,油猴搜脚本为什么会网页无法显示?
建站之星北京办公室:智能建站系统与小程序生成方案解析
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何在云主机上快速搭建网站?
如何在阿里云部署织梦网站?
为什么Go需要go mod文件_Go go mod文件作用说明
上海网站制作开发公司,上海买房比较好的网站有哪些?
海南网站制作公司有哪些,海口网是哪家的?
建站之星代理如何获取技术支持?
如何在万网主机上快速搭建网站?
建站之星好吗?新手能否轻松上手建站?
如何用虚拟主机快速搭建网站?详细步骤解析
*请认真填写需求信息,我们会在24小时内与您取得联系。