Pointers 为什么两个不同的http.Request结构的http.Request.URL.Host地址相同?
这段代码是一个来自大型代码库的自包含示例,用于尝试复制bug。运行此程序时,&request.URL.Host和&request1.URL.Host的地址相同。为什么?据我所知,这是两种不同的结构,所以URL.Host不应该有相同的地址Pointers 为什么两个不同的http.Request结构的http.Request.URL.Host地址相同?,pointers,go,struct,Pointers,Go,Struct,这段代码是一个来自大型代码库的自包含示例,用于尝试复制bug。运行此程序时,&request.URL.Host和&request1.URL.Host的地址相同。为什么?据我所知,这是两种不同的结构,所以URL.Host不应该有相同的地址 package main import ( "crypto/tls" "fmt" "net/http" "net/url" ) func main() { hostname :=
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)
}
是一个结构,其URL字段为指针:
在代码中有一个uri变量,其中包含一个*url.url类型的指针
然后创建2个请求,将指针存储在request1和request2变量中,但将相同的值、相同的指针分配给它们的URL字段
因此只有一个值,您可以将其地址分配给request1.URL和request2.URL。然后打印request1.URL.Host和request2.URL.Host的地址,但由于request1.URL和request2.URL都指向相同且只有URL.URL结构值,因此该结构的主机字段的地址将相同。两个请求结构没有不同的url.url值。您为它们分配了相同的值,为什么它们会不同?即使不是指针,为两个结构的属性分配相同的值也会在两个结构中产生相同的值。是的,这是真的。它们会有自己的值,并且这些值是相同的。@icza你是对的。这真是漫长的一天/脸掌。Thanks@icza@Adrian指出的是,指针和其他任何东西一样都是变量。如果将42赋给两个整数,则它们在内存中有不同的位置,但保留相同的值。如果将同一地址分配给两个指针,指针本身在内存中有不同且独立的位置,但仍然保持相同的值,这一次它只是一个地址,而不是一个整数。
URL *url.URL