golang-取消引用后从结构获取接口实现实例

golang-取消引用后从结构获取接口实现实例,go,struct,types,interface,dereference,Go,Struct,Types,Interface,Dereference,创建实现接口的结构。 将其封装到另一个结构中。 获取结构/取消引用它 获取获取指向接口实现的指针 取消对指针的引用会导致指向接口的另一个点 为什么取消对实现的指针的引用不会给出实现实例 package main import ( "fmt" "net/http" "golang.org/x/net/http2" ) func main() { transport := &http2.Transport{} client := &htt

创建实现接口的结构。 将其封装到另一个结构中。 获取结构/取消引用它

  • 获取获取指向接口实现的指针
  • 取消对指针的引用会导致指向接口的另一个点
  • 为什么取消对实现的指针的引用不会给出实现实例

    package main
    
    import (
        "fmt"
        "net/http"
    
        "golang.org/x/net/http2"
    )
    
    func main() {
        transport := &http2.Transport{}
        client := &http.Client{Transport: transport}
    
        tmp1 := client.Transport
        tmp2 := &client.Transport
        tmp3 := &tmp1
    
        fmt.Printf("%T\n%T\n%T\n", tmp1, tmp2, tmp3)
    
        //dialTLS := tmp1.DialTLS
    }
    
    此代码输出

    *http2.Transport
    *http.RoundTripper
    *http.RoundTripper
    
    &{DialTLS:<nil> TLSClientConfig:0xc8203ec8c0 ConnPool:<nil> DisableCompression:false MaxHeaderListSize:0 t1:<nil> connPoolOnce:{m:{state:0 sema:0} done:0} connPoolOrDef:<nil>}
    
    另外,尝试访问
    tmp1
    (取消注释
    dialTLS:=tmp1.dialTLS
    )的属性会导致编译错误

    tmp1.DialTLS undefined (type http.RoundTripper has no field or method DialTLS)
    
    …即使
    fmt.Printf(“%+v”,tmp1)
    输出

    *http2.Transport
    *http.RoundTripper
    *http.RoundTripper
    
    &{DialTLS:<nil> TLSClientConfig:0xc8203ec8c0 ConnPool:<nil> DisableCompression:false MaxHeaderListSize:0 t1:<nil> connPoolOnce:{m:{state:0 sema:0} done:0} connPoolOrDef:<nil>}
    
    &{DialTLS:TLSClientConfig:0xc8203ec8c0 ConnPool:DisableCompression:false MaxHeaderListSize:0 t1:connPoolOnce:{m:{state:0 sema:0}完成:0}connPoolOrDef:}
    

    我试图做的是访问传输实例中的拨号。

    这里的类型不匹配。如果查看文档,您将看到
    客户机
    结构的
    传输
    字段返回一个接口
    往返程序

    type Client struct {
        // Transport specifies the mechanism by which individual
        // HTTP requests are made.
        // If nil, DefaultTransport is used.
        Transport RoundTripper
    
        // ...
    }
    
    因此,
    tmp1
    的类型是
    http.RoundTripper
    ,尽管底层类型是实现
    RoundTripper
    接口的
    *http2.Transport

    至于
    tmp2
    tmp3
    ,它们被视为指向
    往返者的指针,而不是
    **http2.Transport

    为了检索
    DialTLS
    字段,必须使用类型断言将
    RoundTripper
    转换回
    Transport

    dialTLS := client.Transport.(*http2.Transport).DialTLS
    

    这里的类型不匹配。如果查看文档,您将看到
    客户机
    结构的
    传输
    字段返回一个接口
    往返程序

    type Client struct {
        // Transport specifies the mechanism by which individual
        // HTTP requests are made.
        // If nil, DefaultTransport is used.
        Transport RoundTripper
    
        // ...
    }
    
    因此,
    tmp1
    的类型是
    http.RoundTripper
    ,尽管底层类型是实现
    RoundTripper
    接口的
    *http2.Transport

    至于
    tmp2
    tmp3
    ,它们被视为指向
    往返者的指针,而不是
    **http2.Transport

    为了检索
    DialTLS
    字段,必须使用类型断言将
    RoundTripper
    转换回
    Transport

    dialTLS := client.Transport.(*http2.Transport).DialTLS
    

    啊,我忘了在我的断言中指定指向
    http2.Transport
    的指针!非常感谢!啊,我忘了在我的断言中指定指向
    http2.Transport
    的指针!非常感谢!