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

golang - get interface implementation instance from struct after dereferencing

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

  1. 正在获取指向接口实现的指针。
  2. 解除对指针的引用导致另一个指向接口的点。

为什么取消引用指向实现的指针不会给出实现实例?

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

同样,尝试访问 tmp1 的 属性(取消注释 dialTLS := tmp1.DialTLS)会导致编译错误...

tmp1.DialTLS undefined (type http.RoundTripper has no field or method DialTLS)

...即使 fmt.Printf("%+v", tmp1) 输出...

&{DialTLS:<nil> TLSClientConfig:0xc8203ec8c0 ConnPool:<nil> DisableCompression:false MaxHeaderListSize:0 t1:<nil> connPoolOnce:{m:{state:0 sema:0} done:0} connPoolOrDef:<nil>}

我正在尝试做的是在 Transport 实例中访问 DialTLS

您的类型不匹配。如果您查看文档,您会看到 Client 结构 returns 的字段 Transport 是一个接口 RoundTripper:

type Client struct {
    // Transport specifies the mechanism by which individual
    // HTTP requests are made.
    // If nil, DefaultTransport is used.
    Transport RoundTripper

    // ...
}

因此,tmp1 的类型是 http.RoundTripper,尽管基础类型是 *http2.Transport,它实现了 RoundTripper 接口。

至于 tmp2tmp3,它们被视为指向 RoundTripper 而不是 **http2.Transport.

的指针

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

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