2016-11-16 924 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) 
}