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
的指针!非常感谢!