OneOfOne上面的答案非常好。我在这里发布完整的工作包代码,以方便像我这样的noobs。我添加了几个println,以便您可以在修改之前和之后看到addr值。
package main
import (
"context"
"fmt"
"log"
"net"
"net/http"
"time"
)
func main() {
dialer := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
}
// or create your own transport, there's an example on godoc.
http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
fmt.Println("address original =", addr)
if addr == "google.com:443" {
addr = "216.58.198.206:443"
fmt.Println("address modified =", addr)
}
return dialer.DialContext(ctx, network, addr)
}
resp, err := http.Get("https://google.com")
log.Println(resp.Header, err)
}
谢谢,这个效果很好,我不得不作出一个调整转换“https”开头,在“地址”到“443” –
@RyanD。我会更新答案。 – OneOfOne
@ OneOfOne我在指定IPv6地址addr =“2001:558:fe0d:23 :: 2:443”时遇到了一个问题,我猜是因为冒号分隔符“:”周围的混淆。我以为我看到一个例子,他们把ipv6地址放在[[2001:558:fe0d:23 :: 2]:443]这个ipv6地址上,我认为我有这个工作,但也失败了。努力寻找IPv6示例。有任何想法吗? –