
Redigo 的 Do 方法返回 interface{} 类型响应,直接用 reflect.DeepEqual(resp, 0) 比较会因底层类型不匹配(如 int64 vs int)而失败;应优先使用 redigo 提供的类型转换辅助函数(如 redis.Int)安全转为具体数值类型后再比较。
redigo 的 `do` 方法返回 `interface{}` 类型响应,直接用 `reflect.deepequal(resp, 0)` 比较会因底层类型不匹配(如 `int64` vs `int`)而失败;应优先使用 redigo 提供的类型转换辅助函数(如 `redis.int`)安全转为具体数值类型后再比较。
在使用 Redigo 与 Redis 交互时,SISMEMBER 命令的返回值虽逻辑上是 0 或 1,但其实际 Go 类型并非原生 int,而是由 Redis 协议解析后得到的 int64(或更一般地,interface{} 包裹的 int64)。reflect.DeepEqual 要求值相等且类型一致,因此 reflect.DeepEqual(resp, 0) 在 resp 实际为 int64(0) 时返回 false——因为 int64(0) != int(0) 在类型层面不兼容。
✅ 正确做法是利用 Redigo 内置的类型断言辅助函数,它们专为常见 Redis 响应设计,兼具安全性与简洁性:
resp, err := redis.Int(conn.Do("SISMEMBER", "mySet", "Hello"))
if err != nil {
log.Fatalf("SISMEMBER failed: %v", err)
}
if resp == 0 {
fmt.Println("record doesn't exist")
} else if resp == 1 {
fmt.Println("record exists")
}redis.Int() 会尝试将 interface{} 解包为 int:若原始值为 int64、int32 等可无损转换的整数类型,则成功返回;否则返回错误。这比手动类型断言(如 resp.(int64))更健壮,也远比 reflect.DeepEqual 更高效、语义清晰。
⚠️ 注意事项:
- 避免滥用
reflect.DeepEqual进行基础类型比较——它面向复杂嵌套结构(如 slice/map/struct),对简单标量既低效又易出错; - 始终检查
err:Redis 命令可能因键不存在、连接中断或协议错误返回非数值响应(如nil或字符串错误); - 若需处理更大范围的数值(如超大计数器),可选用
redis.Int64或redis.Uint64,保持类型精度一致。
综上,Redigo 的类型辅助函数(redis.Int, redis.String, redis.Bool, redis.Bytes 等)是与 Do 配合的标准实践,兼顾类型安全、错误反馈和代码可读性——这是比反射比较更专业、更可靠的工程选择。


















