为了账号安全,请及时绑定邮箱和手机立即绑定

调用http.Get时golang恐慌

调用http.Get时golang恐慌

Go
凤凰求蛊 2021-12-07 17:11:49
错误信息:goroutine 11357 [runnable]:net.runtime_pollWait(0x1737f28, 0x77, 0x4fa90)    /usr/local/go/src/runtime/netpoll.go:157 +0x60net.(*pollDesc).Wait(0xc829571bf0, 0x77, 0x0, 0x0)    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3anet.(*pollDesc).WaitWrite(0xc829571bf0, 0x0, 0x0)    /usr/local/go/src/net/fd_poll_runtime.go:82 +0x36net.(*netFD).connect(0xc829571b90, 0x0, 0x0, 0x1714f80, 0xc829572f20, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0)    /usr/local/go/src/net/fd_unix.go:114 +0x1f6net.(*netFD).dial(0xc829571b90, 0x1714f38, 0x0, 0x1714f38, 0xc8295755c0, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0)    /usr/local/go/src/net/sock_posix.go:137 +0x351net.socket(0x3050e8, 0x3, 0x2, 0x1, 0x0, 0xc829575500, 0x1714f38, 0x0, 0x1714f38, 0xc8295755c0, ...)    /usr/local/go/src/net/sock_posix.go:89 +0x411net.internetSocket(0x3050e8, 0x3, 0x1714f38, 0x0, 0x1714f38, 0xc8295755c0, 0xece412272, 0xc833aa2325, 0x473ea0, 0x1, ...)    /usr/local/go/src/net/ipsock_posix.go:160 +0x141net.dialTCP(0x3050e8, 0x3, 0x0, 0xc8295755c0, 0xece412272, 0xc833aa2325, 0x473ea0, 0x2, 0x0, 0x0)    /usr/local/go/src/net/tcpsock_posix.go:171 +0x11enet.dialSingle(0xc829580b80, 0x1714ea8, 0xc8295755c0, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0, 0x0, 0x0)    /usr/local/go/src/net/dial.go:364 +0x3f5net.dialSerial.func1(0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0, 0x0, 0x0)    /usr/local/go/src/net/dial.go:336 +0x75net.dial(0x3050e8, 0x3, 0x1714ea8, 0xc8295755c0, 0xc8232f96e8, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0, ...)    /usr/local/go/src/net/fd_unix.go:40 +0x60net.dialSerial(0xc829580b80, 0xc829572f00, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)    /usr/local/go/src/net/dial.go:338 +0x760net.(*Dialer).Dial(0xc8200783c0, 0x3050e8, 0x3, 0xc823166ed0, 0x10, 0x0, 0x0, 0x0, 0x0)    /usr/local/go/src/net/dial.go:232 +0x50f
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

resp, err := http.Get(url)

defer resp.Body.Close()

if err != nil {

    fmt.Println("err:", err)

    return

}

如果err!= nil,则resp==nil,因此会因 nil 指针取消引用而崩溃。使用以下方法修复您的代码:


resp, err := http.Get(url)

if err != nil {

    fmt.Println("err:", err)

    return

}

defer resp.Body.Close()


查看完整回答
反对 回复 2021-12-07
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

由于使用系统(基于 cgo)解析的同时主机名解析,您可能会达到单个 go 进程的 os 线程限制。要使用每个解析请求不占用一个系统线程的纯解析,请尝试GOBEBUG像这样设置环境变量export GODEBUG=netdns=go(请参阅https://golang.org/pkg/net doc,“名称解析”部分)。

单个 Go 进程的默认 os 线程限制设置为 10000:https : //golang.org/pkg/runtime/debug/#SetMaxThreads

此外,您似乎正在运行最新的 Go 运行时,默认情况下它会输出单个 goroutine 的跟踪;使用GOTRACEBACK=all环境变量集运行将为您提供更大的堆栈跟踪 - 完整发布它总是更好。


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信