为什么http.Request.URL.Host的地址与2个不同的http.Request结构相同?

问题描述:

此代码是从大型代码库中尝试复制错误的独立示例。当这个程序运行时,&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

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你说得对。这是一个非常漫长的一天。 /捂脸。谢谢 –