2017-06-01 83 views
0

此代碼是從大型代碼庫中嘗試複製錯誤的獨立示例。當這個程序運行時,&request.URL.Host&request1.URL.Host的地址是相同的。爲什麼?從我的理解,這是2個不同的結構,所以URL.Host不應該有相同的地址。爲什麼http.Request.URL.Host的地址與2個不同的http.Request結構相同?

package main 

import (
     "crypto/tls" 
     "fmt" 
     "net/http" 
     "net/url" 
) 

func main() { 
     hostname := "www.google.com" 
     uri, err := url.Parse("http://www.google.com/") 
     if err != nil { 
       panic(err) 
     } 
     var tlsConfig *tls.Config 
     tlsConfig = &tls.Config{ 
       ServerName:   hostname, 
       InsecureSkipVerify: true, 
     } 

     client := &http.Client{ 
       Transport: &http.Transport{ 
         DisableKeepAlives: true, 
         TLSClientConfig: tlsConfig, 
       }, 
     } 
     request1 := &http.Request{ 
       Header: http.Header{"User-Agent": {"Foo"}}, 
       Host: hostname, 
       Method: "GET", 
       URL: uri, 
     } 
     request2 := &http.Request{ 
       Header: http.Header{"User-Agent": {"Foo"}}, 
       Host: hostname, 
       Method: "GET", 
       URL: uri, 
     } 

     fmt.Printf("Address1: %s, Address2: %s\n", &request1.URL.Host, &request2.URL.Host) 
     resp, err := client.Do(request1) 
     if err != nil { 
       panic(err) 
     } 
     defer resp.Body.Close() 
     fmt.Printf("\nResponse: %s", resp) 
} 
+1

你給他們分配相同的價值,他們爲什麼會不同? – JimB

回答

1

http.Request是一個結構,它的URL場是指針

URL *url.URL 

在你的代碼有一個uri可變拿着*url.URL類型的指針。

然後,您創建2個請求,將指針存儲在request1request2變量中,但您分配的值相同,但指向它們的URL字段的指針相同。

因此有一個單一的url.URL值,並且您將其地址分配給request1.URLrequest2.URL。然後您打印地址request1.URL.Hostrequest2.URL.Host,但由於request1.URLrequest2.URL都指向相同且只有url.URL(結構)值,該結構的Host字段的地址將相同。這兩個請求結構沒有明顯的url.URL值。

+0

即使它不是一個指針,將相同的值分配給兩個結構的屬性也會在兩個結構中產生相同的值。 – Adrian

+0

是的,這是真的。他們會有自己的價值,價值會是相同的(相等)。 – Adrian

+0

@icza你說得對。這是一個非常漫長的一天。 /捂臉。謝謝 –

相關問題