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

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

  1. Fetching 获取指向接口实现的指针。

  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>}

我正在尝试做的是访问DialTLSTransport 实例。


杨魅力
浏览 143回答 1
1回答

潇湘沐

你在这里有一个类型不匹配。如果您查看文档,您会看到结构的字段Transport返回Client一个接口RoundTripper:type Client struct {&nbsp; &nbsp; // Transport specifies the mechanism by which individual&nbsp; &nbsp; // HTTP requests are made.&nbsp; &nbsp; // If nil, DefaultTransport is used.&nbsp; &nbsp; Transport RoundTripper&nbsp; &nbsp; // ...}因此, 的类型tmp1是http.RoundTripper,尽管底层类型是*http2.Transport实现RoundTripper接口的。至于tmp2and tmp3,它们被视为指向 aRoundTripper而不是 的指针**http2.Transport。为了检索该DialTLS字段,您必须使用类型断言将 a 转换RoundTripper回 a Transport:dialTLS := client.Transport.(*http2.Transport).DialTLS
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go