You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:12:02