2016-11-16 929 views

回答

14

您可以提供自定义Transport.DialContext功能。

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) { 
     if addr == "google.com:443" { 
      addr = "216.58.198.206:443" 
     } 
     return dialer.DialContext(ctx, network, addr) 
    } 
    resp, err := http.Get("https://google.com") 
    log.Println(resp.Header, err) 
} 
+0

谢谢,这个效果很好,我不得不作出一个调整转换“https”开头,在“地址”到“443” –

+0

@RyanD。我会更新答案。 – OneOfOne

+1

@ OneOfOne我在指定IPv6地址addr =“2001:558:fe0d:23 :: 2:443”时遇到了一个问题,我猜是因为冒号分隔符“:”周围的混淆。我以为我看到一个例子,他们把ipv6地址放在[[2001:558:fe0d:23 :: 2]:443]这个ipv6地址上,我认为我有这个工作,但也失败了。努力寻找IPv6示例。有任何想法吗? –

3

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) 
}