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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:06:02