为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨魅力 2022-01-17 10:19:49
创建一个实现接口的结构。将其封装到另一个结构中。获取结构/取消引用它。Fetching 获取指向接口实现的指针。取消引用指针会导致另一个指向接口的点。为什么不取消引用指向实现的指针会给出实现实例?package mainimport (    "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 实例。
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

你在这里有一个类型不匹配。如果您查看文档,您会看到结构的字段Transport返回Client一个接口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接口的。


至于tmp2and tmp3,它们被视为指向 aRoundTripper而不是 的指针**http2.Transport。


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


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


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信