在Go中仅将结构类型指定为结构成员是什么意思?

cfl*_*wis 5 go

我知道我可以编写这样的代码,但是我不知道它是如何工作的:

type MyTransport struct {
  http.Transport
}

func (myT *MyTransport) RoundTrip(r *http.Request) (*http.Response, error) {
  return myT.Transport.RoundTrip(r)
}
Run Code Online (Sandbox Code Playgroud)

http.Transport只是一个结构,对不对?它没有名字。那么如何myT.Transport工作?为什么我不必给运输工具起一个名字MyTransport,比如说它像ht http.Transport

One*_*One 4

这是一个嵌入式结构,来自http://golang.org/doc/ effective_go.html# embedding :

通过直接嵌入结构,我们避免了这种簿记。嵌入类型的方法是免费提供的,这意味着 bufio.ReadWriter 不仅具有 bufio.Reader 和 bufio.Writer 的方法,还满足所有三个接口:io.Reader、io.Writer 和 io.ReadWriter。

嵌入与子类化有一个重要的区别。当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,该方法的接收者是内部类型,而不是外部类型。在我们的示例中,当调用 bufio.ReadWriter 的 Read 方法时,它与上面写的转发方法具有完全相同的效果;接收者是 ReadWriter 的读者字段,而不是 ReadWriter 本身。

嵌入也可以带来简单的便利。此示例显示了一个嵌入字段和一个常规命名字段。

长话短说:

这或多或少是 go 的“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)
}
Run Code Online (Sandbox Code Playgroud)