ホームページ > バックエンド開発 > Golang > Go でさまざまな型に共通のメソッドを実装する場合、コードを再利用するにはどうすればよいですか?

Go でさまざまな型に共通のメソッドを実装する場合、コードを再利用するにはどうすればよいですか?

DDD
リリース: 2024-11-11 02:41:02
オリジナル
252 人が閲覧しました

How can I reuse code when implementing a common method for different types in Go?

Go のインターフェイスを使用した共通メソッドの実装

Go では、インターフェイスは、さまざまな型が同じメソッドのセットを実装するためのメカニズムを提供します。コード内のポリモーフィズムのため。ただし、2 つの異なる型で共通のメソッドを実装したいが、冗長なコードは避けたいという状況に遭遇することがあります。

次のシナリオを考えてみましょう。

type First struct {
    str string
}

type Second struct {
    str string
}

type A interface {
    PrintStr()
}
ログイン後にコピー

次のシナリオを考えてみましょう。

func (f First) PrintStr() {
    fmt.Print(f.str)
}

func (s Second) PrintStr() {
    fmt.Print(s.str)
}
ログイン後にコピー

First 構造体と Second struct の両方で、通常は次のような個別のメソッドを作成します。

このアプローチは機能しますが、コードが作成される可能性があります。同じメソッドを実装する必要がある型が複数ある場合は重複します。これを克服するために、Go は型埋め込みとして知られる洗練されたソリューションを提供します。

型埋め込み

type WithString struct {
    str string
}

func (w WithString) PrintStr() {
    fmt.Print(w.str)
}
ログイン後にコピー

型埋め込みを使用すると、既存の型を埋め込むことで新しい型を作成できます。この場合、共通の str フィールドと PrintStr メソッドを含む基本型を作成できます。

type First struct {
    WithString
}

type Second struct {
    WithString
}
ログイン後にコピー

これで、WithString 型を 1 番目と 2 番目の構造体に埋め込むことができます。

これにより、First 構造体と Second 構造体は両方とも、埋め込まれた WithString 型から PrintStr メソッドを継承します。これにより、構造体ごとに個別のメソッドを実装する必要がなくなります。

package main

import "fmt"

type WithString struct {
    str string
}

func (w WithString) PrintStr() {
    fmt.Print(w.str)
}

type First struct {
    WithString
}

type Second struct {
    WithString
}

func main() {
    a := First{
        WithString: WithString{
            str: "foo",
        },
    }

    a.PrintStr() // Outputs: foo
}
ログイン後にコピー

次に、型の埋め込みを使用して 2 つの異なる型に共通のメソッドを実装する方法の例を示します。

このアプローチにより、共通メソッドの単一実装を維持しながら、異なる型で使用できるようになります。コードの再利用性を促進し、コードの重複を削減します。

以上がGo でさまざまな型に共通のメソッドを実装する場合、コードを再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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