Go二叉树手术室预订系统返回值异常:false意外变为true
手术室预订系统BinaryTree插入返回值异常排查
问题概述
基于BinaryTree实现手术室预订功能时出现返回值异常:BinaryNode.insert代码中明确执行return false, nil,但上层BinaryTree.insert接收到的返回值却是true, nil。测试场景中插入2022-01-01 18:00至20:00的预订,预期返回false但实际返回true,导致测试不通过,怀疑竞态条件是诱因。
关键测试日志
2023/01/13 12:34:18 node 2 2023/01/13 12:34:18 diff 1h0m0s true 2023/01/13 12:34:18 existing 2022-01-01 15:00:00 +0700 WIB 2022-01-01 17:00:00 +0700 WIB 2023/01/13 12:34:18 new 2022-01-01 18:00:00 +0700 WIB 2022-01-01 20:00:00 +0700 WIB 2023/01/13 12:34:18 BookingKamarOperasi_v2.isLessThanTwoHoursApart return 2, nil 2023/01/13 12:34:18 BinaryNode.ok 2 false 2023/01/13 12:34:18 BinaryTree.insert ok true <nil> 2023/01/13 12:34:18 SafeDB_v2.Insert true
相关代码片段
BinaryNode.insert 返回逻辑
log.Println("BinaryNode.ok " + strconv.Itoa(isLess) + " " + strconv.FormatBool(false)) return false, nil
BinaryTree.insert 接收返回值逻辑
ok, err := t.root.insert(data) log.Println("BinaryTree.insert ok", ok, err)
排查方向
- 分支逻辑校验:检查
BinaryNode.insert是否存在其他return路径,比如在打印日志的return语句之前,是否有提前返回true的分支;或者确认当前打印日志的return语句是否确实被执行到,而非其他节点的日志输出。 - 竞态条件验证:若BinaryTree存在并发访问场景,检查是否有多个goroutine同时操作root节点,导致返回值被覆盖或逻辑执行混乱,比如insert过程中root节点被其他协程修改,上层接收到错误的返回值。
- 返回值传递检查:确认
BinaryNode.insert的返回值类型与BinaryTree.insert接收的类型完全匹配,排查是否存在类型转换错误或返回值被意外修改的情况。 - 日志链路追踪:给日志添加唯一标识(如请求ID、节点ID),明确每条日志对应的调用链路,避免不同insert操作的日志交叉导致误解。
- 递归逻辑校验:若
BinaryNode.insert是递归实现,检查递归返回时是否正确传递了返回值,比如是否存在递归调用后错误覆盖原本false返回值、返回true的情况。
内容的提问来源于stack exchange,提问作者Jason Rich Darmawan
相关产品推荐
相关产品推荐

