go
runtime_error
ai_generated
true
panic: http: 服务器已关闭
panic: http: Server closed
ID: go/httptest-server-close-panic
80%修复率
85%置信度
0证据数
2024-03-15首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 1.21 | active | — | — | — |
根因分析
关闭 httptest 测试服务器后,仍有并发请求在途,访问已关闭的监听器引发 panic。
English
调用 httptest.Server.Close() 后,仍有 goroutine 尝试向该服务器发送请求,导致底层连接被关闭,触发 panic。
解决方案
-
95% 成功率
使用 sync.WaitGroup 确保所有请求完成后关闭服务器
-
85% 成功率
设置 server.Config.ReadTimeout 和 WriteTimeout,避免请求无限期挂起
无效尝试
常见但无效的做法:
-
90% 失败
httptest.Server 关闭后不可复用,连接池中的连接已失效,重试只会导致相同 panic
-
75% 失败
defer 在函数结束时才执行,但未等待所有 goroutine 结束,仍可能触发 panic
-
60% 失败
panic 是致命的,捕获后程序状态可能不一致,且掩盖了真正的并发问题