我知道我可以这样写代码,但我不知道它是如何工作的:
type MyTransport struct {
http.Transport
}
func (myT *MyTransport) RoundTrip(r *http.Request) (*http.Response, error) {
return myT.Transport.RoundTrip(r)
}http.Transport只是一个结构,对吗?它没有名字。那么myT.Transport是如何工作的呢?为什么我不必在MyTransport中给传输一个名称,比如声明它像ht http.Transport
发布于 2014-06-06 21:31:54
这是一个来自go.html#embedding的嵌入式结构:
通过直接嵌入结构,我们避免了这种簿记。嵌入式类型的方法是免费的,这意味着bufio.ReadWriter不仅有bufio.Reader和bufio.Writer的方法,而且它还满足所有三个接口: io.Reader、io.Writer和io.ReadWriter。 嵌入与子类有一个重要的区别。当我们嵌入一个类型时,该类型的方法变成了外部类型的方法,但是当它们被调用时,该方法的接收方是内部类型,而不是外部类型。在我们的示例中,当调用bufio.ReadWriter的Read方法时,它的效果与上面所写的转发方法完全相同;接收方是ReadWriter的读取器字段,而不是ReadWriter本身。 嵌入也可以是一个简单的方便。这个例子显示了一个嵌入字段和一个常规的、命名的字段。
TL;DR:
这就是"oop“继承的方式,或多或少:
type MyTransport struct {
http.Transport
}
//without this function, calling myT.RoundTrip would actually call myT.Transport.RoundTrip
func (myT *MyTransport) RoundTrip(r *http.Request) (*http.Response, error) {
return myT.Transport.RoundTrip(r)
}发布于 2014-06-06 21:31:41
这就是所谓的嵌入。如果你还没有读过“有效的行动”,你就应该去读。go.html#embedding
简而言之,嵌入式http.Transport的方法可以通过MyTransport结构访问。
发布于 2014-06-06 21:36:28
该语言的那个属性称为Embedding:go.html#embedding
如果文档正在对相关部分进行过载,以了解您为什么要编写
type MyTransport struct {
http.Transport
}而不是
type MyTransport struct {
transport http.Transport
}这是:
// ReadWriter stores pointers to a Reader and a Writer.
// It implements io.ReadWriter.
type ReadWriter struct {
*Reader // *bufio.Reader
*Writer // *bufio.Writer
}嵌入的元素是指向结构的指针,当然必须初始化为指向有效的结构,然后才能使用它们。可以将ReadWriter结构编写为
type ReadWriter struct {
reader *Reader
writer *Writer
}但是,为了推广字段的方法和满足io接口,我们还需要提供转发方法,如下所示:
func (rw *ReadWriter) Read(p []byte) (n int, err error) {
return rw.reader.Read(p)
}将其视为“将所有结构定义及其方法复制到此结构中”。
https://stackoverflow.com/questions/24090820
复制相似问题