Go语言使用SOCKS5代理发送HTTP(s)请求出现报错如何解决
问题排查&修复方案
1. 空指针panic的直接原因
你代码中client.Get返回错误后,没有终止逻辑直接访问了resp.Body:当请求失败时resp为nil,访问nil的成员必然触发空指针panic。
2. 代理连接超时的原因
- 首先排查代理本身可用性:先通过其他工具验证这个SOCKS5代理是否可以正常连通,比如用curl命令测试
curl --socks5 175.101.15.35:84 https://api.ipify.org?format=json,如果测试失败,说明代理地址不可用、需要认证或者你的网络无法访问该代理节点。 - 部分低版本Go内置的
http.Transport对SOCKS5协议的支持存在兼容性问题,可使用第三方SOCKS5 dialer实现替换默认的Transport DialContext逻辑解决。 - 你当前代码忽略了
url.Parse的错误,也可能隐藏了代理地址格式错误的问题。
修正后的代码
package main import ( "crypto/tls" "fmt" "io/ioutil" "net/http" "net/url" ) const ( PROXY_ADDR = "socks5://175.101.15.35:84" REQ_URL = "https://api.ipify.org?format=json" ) func main() { // 处理代理地址解析错误 url_proxy, err := url.Parse(PROXY_ADDR) if err != nil { fmt.Printf("代理地址解析失败: %v\n", err) return } transport := &http.Transport{ Proxy: http.ProxyURL(url_proxy), TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, } client := &http.Client{ Transport: transport, } resp, err := client.Get(REQ_URL) if err != nil { fmt.Printf("请求失败: %v\n", err) // 出错直接返回,避免访问nil的resp return } // 正常请求结束后关闭body defer resp.Body.Close() responseBody, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Printf("读取响应失败: %v\n", err) return } fmt.Println(string(responseBody)) }
额外说明
如果上述代码还是报代理连接超时,说明你使用的SOCKS5代理本身不可用,更换可用的代理节点即可正常运行。
内容的提问来源于stack exchange,提问作者Ninja Boy
相关产品推荐
相关产品推荐

