Go运行TLS批量并发请求时出现nil pointer dereference错误如何修复
错误根因
- 报错是典型的空指针引用 panic,从堆栈可以看到调用
crypto/tls.(*Conn).Close时传入的连接对象是0x0(nil):
当tls.Dial连接失败返回错误时,返回的连接对象s本身就是 nil,但你没有终止当前 goroutine 执行,后续的defer s.Close()和s.Write都会操作 nil 指针,直接触发段错误。
修复方案
在连接失败打印错误后直接 return 退出当前 goroutine,避免后续对 nil 指针的操作即可,修复后的完整代码如下:
package main import ( "time" "fmt" "crypto/tls" ) func main() { var ( targetHost = "Website URL" targetPort = "443" targetURL = targetHost + ":" + targetPort ) for { for i := 0; i < 500; i++ { go func() { s, err := tls.Dial("tcp", targetURL, &tls.Config { ServerName: targetHost, InsecureSkipVerify: true, }) if err != nil { fmt.Println("Error when connect to " + targetHost) return // 新增:连接失败直接退出goroutine,不执行后续操作 } defer s.Close() for i := 0; i < 100; i++ { _, err := s.Write([]byte("GET / HTTP/1.1\r\nHost: " + targetHost + "\r\n\r\n")) // 可选:增加Write错误处理,写入失败也退出循环 if err != nil { fmt.Println("Write error:", err) break } } }() } time.Sleep(1 * time.Second) } }
额外优化建议
- 现有逻辑每秒启动500个并发连接,每个连接循环发送100次请求,很容易耗尽本地端口、被目标站点限流拦截,可根据实际需求降低并发数。
- 目前代码发送请求后没有读取响应,TCP缓冲区满后会导致Write阻塞,可以补充响应读取逻辑避免异常。
内容的提问来源于stack exchange,提问作者Stupid Cheems
相关产品推荐
相关产品推荐

