Pointers 为什么两个不同的http.Request结构的http.Request.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 :=

这段代码是一个来自大型代码库的自包含示例,用于尝试复制bug。运行此程序时,&request.URL.Host和&request1.URL.Host的地址相同。为什么?据我所知,这是两种不同的结构,所以URL.Host不应该有相同的地址

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