首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将结构类型指定为Go中的结构成员意味着什么?

将结构类型指定为Go中的结构成员意味着什么?
EN

Stack Overflow用户
提问于 2014-06-06 21:22:55
回答 4查看 347关注 0票数 6

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

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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“继承的方式,或多或少:

代码语言:javascript
复制
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)
}
票数 4
EN

Stack Overflow用户

发布于 2014-06-06 21:31:41

这就是所谓的嵌入。如果你还没有读过“有效的行动”,你就应该去读。go.html#embedding

简而言之,嵌入式http.Transport的方法可以通过MyTransport结构访问。

票数 2
EN

Stack Overflow用户

发布于 2014-06-06 21:36:28

该语言的那个属性称为Embedding:go.html#embedding

如果文档正在对相关部分进行过载,以了解您为什么要编写

代码语言:javascript
复制
type MyTransport struct {
  http.Transport
}

而不是

代码语言:javascript
复制
type MyTransport struct {
  transport http.Transport
}

这是:

代码语言:javascript
复制
// ReadWriter stores pointers to a Reader and a Writer.
// It implements io.ReadWriter.
type ReadWriter struct {
    *Reader  // *bufio.Reader
    *Writer  // *bufio.Writer
}

嵌入的元素是指向结构的指针,当然必须初始化为指向有效的结构,然后才能使用它们。可以将ReadWriter结构编写为

代码语言:javascript
复制
type ReadWriter struct {
    reader *Reader
    writer *Writer
}

但是,为了推广字段的方法和满足io接口,我们还需要提供转发方法,如下所示:

代码语言:javascript
复制
func (rw *ReadWriter) Read(p []byte) (n int, err error) {
    return rw.reader.Read(p)
}

将其视为“将所有结构定义及其方法复制到此结构中”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24090820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档