[英]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)
}
將其視為“將所有結構定義及其方法復制到此結構”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.