首頁 > 後端開發 > Golang > Go中的嵌入方法可以存取父物件欄位嗎?

Go中的嵌入方法可以存取父物件欄位嗎?

Barbara Streisand
發布: 2024-12-06 18:36:21
原創
918 人瀏覽過

Can Embedded Methods in Go Access Parent Object Fields?

從嵌入方法訪問父字段

背景

使用嵌入方法來簡化時物件導向編程,出現一個問題:這些方法能否存取父類別的欄位物件?

目標

目標是為Go 建立一個模仿Active Record 模式的ORM,其中附加了Save() 和Delete() 等方法正在保存或刪除的物件。這種方法簡化了程式碼的可讀性,並將其與底層資料儲存解耦。

範例

下面的程式碼示範了 Foo 中的嵌入方法(Test())類型:

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())可以存取父(Foo)物件的Name欄位嗎?

回答

不,Go 中沒有直接的方法來實作嵌入式方法來存取其父物件的欄位。 Test() 方法的接收者類型是 *Bar,而目標物件的類型是 Foo。

替代方法

如果必須訪問父字段,則可以解決方案包括:

  • 在嵌入類型中添加一個interface{}欄位,並將其設定為包含類型
  • 採用db.Save(user)的方式而不是user.Save(),這樣可以提供更好的擴充性並降低全域狀態問題的風險。

以上是Go中的嵌入方法可以存取父物件欄位嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板