ホームページ  >  記事  >  バックエンド開発  >  基本構造体に影響を与えずに Go で埋め込み構造体メソッドをオーバーライドする方法

基本構造体に影響を与えずに Go で埋め込み構造体メソッドをオーバーライドする方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 03:01:03269ブラウズ

How to Override Embedded Struct Methods in Go Without Affecting the Base Struct?

Go での埋め込み構造体メソッドのオーバーライド

Go では、埋め込み構造体は基本構造体のフィールドとメソッドを継承します。ただし、基本構造体と埋め込み構造体の両方が同じ名前のメソッドを実装すると、競合が発生する可能性があります。この記事では、基本構造体に影響を与えることなく、埋め込まれた構造体のメソッドをオーバーライドする解決策について説明します。

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

<code class="go">package main

import "fmt"

type Base struct {
    val int
}

func (b *Base) Set(i int) {
    b.val = i
}

type Sub struct {
    Base
    changed bool
}

func (b *Sub) Set(i int) {
    b.val = i
    b.changed = true
}

func main() {
    s := &Sub{}
    s.Base.Set(1)
    var b *Base = &s.Base

    // Both print the same value
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}</code>

ここでは、Sub 型が Base 型を埋め込んでいます。 Sub と Base の両方には Set という名前のメソッドがあり、s.Base.Set() を呼び出すと、Sub.Set() メソッドをバイパスして Base.Set() メソッドを直接呼び出します。

To埋め込み構造体のメソッドをオーバーライドする場合は、代わりに Sub.Set() メソッドを呼び出すことができます。 Go では、型がその埋め込み型と同じ名前のメソッドを実装する場合、埋め込みメソッドは非表示になります。

コードの更新バージョンは次のとおりです。

<code class="go">func (b *Sub) Set(i int) {
    b.Base.Set(i) // Call the Base.Set() method
    b.changed = true
}

func main() {
    s := &Sub{}
    s.Set(1)
    var b *Base = &s.Base

    // Note: b.val is now 1
    // s.changed is now true
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}</code>

この例ではs.Set(1) を呼び出すと、Sub.Set() メソッドが呼び出され、次に Base.Set() メソッドが呼び出されます。これにより、Sub に埋め込まれた Base 構造体の val フィールドが更新されます。 Changed フィールドも true に設定され、値が変更されたことを示します。

このソリューションを使用すると、基本構造体に影響を与えることなく、埋め込み構造体のメソッドをオーバーライドできます。これは、コードの再利用性と柔軟性を実現するために Go で使用される一般的な手法です。

以上が基本構造体に影響を与えずに Go で埋め込み構造体メソッドをオーバーライドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。