xiaowei-system/skills/software-development/go-learning/references/go-code-patching.md

3.3 KiB
Executable File
Raw Blame History

Go 代码修改技术要点

来源2026-06-09 修复 consolidation cluster_only bug 实战


1. Go 缩进规范tabs

switch expr {
    case "a":          // 4 tabs
        foo()          // 5 tabs
    case "b", "c":     // 4 tabs
        bar()          // 5 tabs
        baz()          // 5 tabs
        if cond {      // 6 tabs
            qux()      // 7 tabs
        }
    default:
        quux()         // 5 tabs
}
  • switch 语句本身T5比包裹它的 func/block 多 4 层)
  • case 标签T4比 switch 多 1 层)
  • case 第一条语句T5比 case 多 1 层)
  • case 嵌套 block:每层 +1 tab

验证实际缩进:python3 -c "with open('file.go','rb') as f: [print(i+1, len(l)-len(l.lstrip()), l.rstrip()) for i,l in enumerate(f) if b'case' in l or b'switch' in l]"


2. patch 工具失效时的字节级修复

当 patch 工具因 tab/space 缩进不匹配而失败时,用 Python 字节级读写:

python3 -c "
with open('/path/to/server.go','rb') as f:
    data = f.read()

# 替换6 tabs -> 5 tabs
old = b'\x09\x09\x09\x09\x09\x09graphStore.Prune(0.15)'  # 6 tabs
new = b'\x09\x09\x09\x09\x09graphStore.Prune(0.15)'        # 5 tabs

count = data.count(old)
print(f'Found: {count}')
if count:
    data = data.replace(old, new, 1)
    with open('/path/to/server.go','wb') as f:
        f.write(data)
    print('Fixed!')
"

关键点:

  • \x09 表示 tab不要用文字 \t(可能有转义问题)
  • rb 模式读取,保留原始字节
  • 替换后立即 go build ./... 验证

3. Binary 部署验证

# 查看真实 mtimestat 比 find 更可靠)
stat --format='%y' /home/muc/.local/bin/zhiyid

# 对比 git commit 时间
git -C /home/muc/projects/memoryweave log -1 --format="%ci" HEAD

# restart 并验证
systemctl --user restart zhiyid && sleep 2 && systemctl --user status zhiyid

⚠️ find -printf "%T+" 对普通文件返回正确时间,但对某些文件(如 device node可能返回 Unix epoch 0。


4. 织忆 Consolidation Pipeline 两种模式

位于 go/internal/api/routes/consolidation_pipe.go

模式 调用 包含步骤
cluster_only consolPipe.Run() Rust sidecar聚类+ runGraphMaintenancePageRank
full consolPipe.RunWithMode("full") Rust sidecar聚类+decay+quality+ runGraphMaintenancePrune+PageRank

调度规则server.go

  • t_distillRun()cluster_only高频 60s
  • t_consolidation / t_backtrackRunWithMode("full")fullcooldown=48h
  • t_prune → 单独 graphStore.Prune(0.15) 调用Go 层T5 缩进)
  • t_decay → 单独 decay 逻辑(从 ldb.GetCandidatesForForgetting 读取)

常见 bug consolPipe.Run() 默认 cluster_onlyconsolidation 触发器实际跑了快速聚类,跳过了 decay/quality 步骤。修复ticker switch 中 case "consolidation" 改为 RunWithMode("full")


5. journalctl 调试技巧

# 只看某 PID 的日志
journalctl --user -u zhiyid -n 100 | grep "$(pgrep -n zhiyid)"

# 按 trigger 过滤
journalctl --user -u zhiyid --no-pager | grep -E "consolidation|Rust sidecar|prune|Decay|Quality"

# 看服务启动日志
journalctl --user -u zhiyid -n 20 --no-pager | grep -v "971305"

记录日期2026-06-09