为什么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)
}
答
http.Request
是一个结构,它的URL
场是指针:
URL *url.URL
在你的代码有一个uri
可变拿着*url.URL
类型的指针。
然后,您创建2个请求,将指针存储在request1
和request2
变量中,但您分配的值相同,但指向它们的URL
字段的指针相同。
因此有一个单一的url.URL
值,并且您将其地址分配给request1.URL
和request2.URL
。然后您打印地址request1.URL.Host
和request2.URL.Host
,但由于request1.URL
和request2.URL
都指向相同且只有url.URL
(结构)值,该结构的Host
字段的地址将相同。这两个请求结构没有明显的url.URL
值。
你给他们分配相同的价值,他们为什么会不同? – JimB