簡體   English   中英

在Go中僅將結構類型指定為結構成員是什么意思?

[英]What does it mean to specify just a struct type as a struct member in Go?

我知道我可以寫這樣的代碼,但我不知道它是如何工作的:

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

這是一個嵌入式結構,來自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本身。

嵌入也可以是一個簡單的方便。 此示例顯示嵌入字段以及常規命名字段。

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)
}

這稱為嵌入。 如果您還沒有閱讀Effective Go,那么您應該這樣做。 http://golang.org/doc/effective_go.html#embedding

簡而言之,嵌入式http.Transport的方法可以通過MyTransport結構訪問。

該語言的屬性稱為嵌入: http//golang.org/doc/effective_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)
}

將其視為“將所有結構定義及其方法復制到此結構”

為什么我不必在MyTransport中為傳輸命名

您已創建匿名字段,因此非限定類型名稱將充當字段名稱

有關詳細信息,請參閱此處規范

使用類型但沒有顯式字段名稱聲明的字段是匿名字段,也稱為嵌入字段或在結構中嵌入類型。 必須將嵌入類型指定為類型名稱T或指向非接口類型名稱* T的指針,並且T本身可能不是指針類型。 非限定類型名稱充當字段名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM