ホームページ > バックエンド開発 > Golang > Go の埋め込みメソッドは親オブジェクトのフィールドにアクセスできますか?

Go の埋め込みメソッドは親オブジェクトのフィールドにアクセスできますか?

Barbara Streisand
リリース: 2024-12-06 18:36:21
オリジナル
918 人が閲覧しました

Can Embedded Methods in Go Access Parent Object Fields?

埋め込みメソッドから親フィールドへのアクセス

背景

埋め込みメソッドを使用して簡略化する場合オブジェクト指向プログラミングでは、これらのメソッドはオブジェクト指向プログラミングのフィールドにアクセスできるかという疑問が生じます。親オブジェクト?

目標

目標は、Save() や Delete() などのメソッドがアタッチされる Active Record パターンを模倣する Go 用の ORM を作成することです。保存または削除されるオブジェクトに。このアプローチにより、コードの可読性が簡素化され、基盤となるデータ ストアからコードが切り離されます。

以下のコードは、Foo 内の埋め込みメソッド (Test()) を示しています。 type:

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{} フィールドを埋め込みタイプに追加し、それを包含タイプに設定します。初期化。
  • user.Save() ではなく db.Save(user) のアプローチを採用します。これにより、拡張性が向上し、グローバルな状態の問題のリスクが軽減されます。

以上がGo の埋め込みメソッドは親オブジェクトのフィールドにアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート