嵌入式方法可以存取父欄位嗎?
在 Go 中,嵌入式方法是程式碼重複使用和組織的強大機制。但是,出現了一個常見問題:嵌入式方法可以直接存取其父結構體的欄位嗎?
背景
對於上下文,假設您正在建立一個Active Record - Go 的風格ORM,其中常見的CRUD 方法嵌入在使用者結構中以提高可讀性和抽象性。這將允許您編寫 user.Save() 而不是 data.Save(user)。
範例
考慮以下程式碼片段:
package main import ( "fmt" "reflect" ) func main() { test := Foo{Bar: &Bar{}, Name: "name"} test.Test() } type Foo struct { *Bar Name string } func (s *Foo) Method() { fmt.Println("Foo.Method()") } type Bar struct { } func (s *Bar) Test() { t := reflect.TypeOf(s) v := reflect.ValueOf(s) fmt.Printf("model: %+v %+v %+v\n", s, t, v) fmt.Println(s.Name) s.Method() }
重新檢視問題
重新檢視問題。在於是否有辦法使頂級字段可以透過嵌入式方法存取。在上面的範例中,Test 方法嵌入在 Bar 中,並嘗試從父 Foo 結構體存取 Name 欄位。Answer
不幸的是,Go 不提供嵌入式方法存取其父結構體欄位的任何直接機制。 Test方法的接收者是指向Bar的指針,Go沒有辦法判斷它是否嵌入。可能的解決方案
實現對於此功能,一個潛在的解決方法是向Bar 結構添加一個interface{} 成員,要求實現它的類型將該成員設定為包含類型。此成員的初始化可以由呼叫者負責,也可以透過 ORM 方法處理。然而,這種方法引入了額外的複雜性和潛在的維護問題。替代視角
或者,考慮將 API 建構為 db.Save(user) 可能不會的可能性如看起來那麼有害。這種方法提供了一種支援多個資料庫的簡單方法,並避免依賴全域狀態。以上是嵌入式 Go 方法可以存取父結構體欄位嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!