Go のメソッド継承のために埋め込み構造体を置き換えることはできますか?

Patricia Arquette
リリース: 2024-11-01 02:54:28
オリジナル
810 人が閲覧しました

  Can Embedded Structs Be Replaced for Method Inheritance in Go?

埋め込み構造体とメソッドの継承

メソッドを継承するための埋め込み構造体の代替手段はありますか?

はい、あります。埋め込み構造体を使用せずに型のメソッドを継承する別の方法。ただし、Go の型システムをより深く理解する必要があります。

埋め込み構造体

Go では、構造体を埋め込むと、埋め込まれた構造体のフィールドとメソッドにアクセスできます。あたかもそれを含む構造体の一部であるかのように。これは、型間の継承を作成するために使用できる強力な機能です。

注意点

構造体を埋め込む場合、埋め込まれた構造体のメソッド セットは、含まれる構造体に自動的に昇格されます。メソッドをプロモートするには、埋め込まれた構造体が匿名である必要があります。

メソッド プロモーション

メソッド プロモーションは、匿名の埋め込み構造体のメソッドにあたかもアクセスできるようにする言語機能です。これらは、それを含む構造体のメソッドでした。これは、次のルールに従うことで実現されます。

  • 匿名フィールドの型が T の場合、プロモートされたメソッドには型 T および *T のレシーバーがあります。
  • 匿名フィールドの型が *T の場合、プロモートされたメソッドにはタイプ T または*T.

次のコードを考えてみましょう:

<code class="go">type Props map[string]interface{}

func (p Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := Node{"test": "foo"}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>
ログイン後にコピー

この例では、Node 構造体に匿名構造体が埋め込まれています。小道具タイプ。これにより、Props の GetString メソッドを Node に昇格できるようになります。

代替アプローチ

埋め込みを行わない代替アプローチは、ポインター レシーバーを使用することです。レシーバー関数にポインターを渡すことにより、構造体を埋め込まなくても、基になる構造体のフィールドとメソッドにアクセスできます。

ここに代替実装があります。ポインタ レシーバの使用:

<code class="go">type Props map[string]interface{}

func (p *Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := &Node{Props{"test": "foo"}}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>
ログイン後にコピー

この例では、GetString メソッドにポインタ レシーバを使用します。これにより、基礎となる Props 構造体を埋め込むことなくフィールドとメソッドにアクセスできるようになります。

結論

埋め込まれた構造体は継承のための強力なツールですが、が常に最良の選択であるとは限りません。メソッドのプロモーションが望ましくない、または必要でない場合は、ポインター レシーバーを使用すると、より柔軟でパフォーマンスの高い代替手段を提供できます。

以上がGo のメソッド継承のために埋め込み構造体を置き換えることはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!