ホームページ  >  記事  >  バックエンド開発  >  Golang関数に構造体型の応用スキルを埋め込む

Golang関数に構造体型の応用スキルを埋め込む

WBOY
WBOYオリジナル
2023-05-17 08:12:241735ブラウズ

Golang 関数の構造型のアプリケーション スキルの埋め込み

Golang は、構造型の定義である「オブジェクト」のカプセル化をサポートする、厳密に型指定されたプログラミング言語です。埋め込み型を構造型で使用して、既存の型を拡張することもできます。 Golang では、埋め込み型は実際に、型の名前を別の構造型のフィールド型として使用します。

この記事では、構造型の埋め込みの応用スキル、具体的には、Golang 関数で型が埋め込まれた構造を使用する方法について説明します。

構造型の埋め込み

Golang に構造型を埋め込むには、主に 2 つの方法があります。1 つは構造型名を匿名フィールドとして使用する方法、もう 1 つは指定された型名を使用する方法です。ここでは主に最初の方法について説明します。

構造体の型名を匿名フィールドとして使用する場合、埋め込み構造体は匿名構造体のすべてのフィールドとメソッドを継承し、独自のフィールドとメソッドとして使用します。次の例を見てください:

type Animal struct {
    Name string
    Age  int
}
type Person struct {
    Animal
    Gender string
}

上の例では、2 つの構造タイプ Animalperson を定義します。ここで、PersonThe Animal 構造タイプは、Animal 構造 ## で定義された Name および Age を person 構造が継承できるように埋め込まれています。 #2つのフィールド。このようにして、Person 構造体を通じて Animal 構造体のフィールドにアクセスできます。

// 构造一个Person类型的对象
p := Person{
    Animal: Animal{
        Name: "Tom",
        Age:  18,
    },
    Gender: "Male",
}
// 访问Animal结构体中的字段
fmt.Println(p.Name, p.Age)

この例では、

p という名前の person 型のオブジェクトを定義し、Animal 構造型を Name# に変換します。 ## フィールドと Age フィールドは、それぞれ "Tom"18 に設定されます。 fmt.Println 関数を使用して p オブジェクトの Name フィールドと Age フィールドを出力すると、実際には Animal# # にアクセスします。 #構造タイプの 2 つのフィールド NameAge構造型埋め込みを使用して「継承」を実装する

オブジェクト指向プログラミングでは、コードの再利用を実現するためにクラス継承の考え方を使用することが必要になることがよくあります。 Golang はクラス継承をサポートしていませんが、構造体型の埋め込みを使用して、クラス継承に似たいくつかの機能を実現できます。次の例では、例としてグラフィックスを使用して、構造型の埋め込みを使用して「継承」を実装する方法を示します。

type Shape struct {
    Name string
}
func (s *Shape) Draw() {
    fmt.Println("Drawing shape:", s.Name)
}

type Circle struct {
    Shape
    Radius float64
}
func (c *Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

type Rectangle struct {
    Shape
    Length float64
    Width  float64
}
func (r *Rectangle) Area() float64 {
    return r.Length * r.Width
}

上の例では、

Shape

CircleRectangle という 3 つの構造タイプを定義しました。このうち、Shape は基本クラス、CircleRectangle は、Shape 構造型を埋め込むことで「継承」を実装する派生クラスです。 。 Shape 構造体タイプの埋め込みを使用すると、Circle および Rectangle 構造体タイプには、Shape 構造体タイプのメンバー変数とメソッドが含まれます。

func main() {
    c := Circle{
        Shape: Shape{"Circle"},
        Radius: 5.0,
    }
    r := Rectangle{
        Shape: Shape{"Rectangle"},
        Length: 10.0,
        Width:  8.0,
    }
    c.Draw()
    r.Draw()
    fmt.Println("Circle area=", c.Area())
    fmt.Println("Rectangle area=", r.Area())
}
この例では、Circle

および

Rectangle 型の 2 つのオブジェクトを構築し、それぞれのプロパティを設定しました。次に、Draw() メソッドを呼び出して、これら 2 つのグラフィックを描画し、その面積を計算しました。 上記の例では、Circle

RectangleDraw() メソッドを呼び出しており、実際には継承を呼び出していることに注意してください。 ShapeDraw() メソッド。これは、CircleRectangle 構造型の両方が Shape 構造型を埋め込み、そのメソッドを継承しているためです。 構造型の埋め込みを使用してデコレータ パターンを実装する

ソフトウェア デザイン パターンでは、デコレータ パターンは、拡張機能を必要とするインスタンスをラップできるようにする構造的なデザイン パターンです。制限のないオブジェクト。 Golang では、構造型の埋め込みを使用してデコレーター パターンを簡単に実装することもできます。

次の例は、構造体型の埋め込みを使用して単純なデコレータ パターンを実装する方法を示しています。

type Sender interface {
    Send(message string) error
}

type EmailSender struct{}

func (es *EmailSender) Send(message string) error {
    fmt.Println("Email is sending...", message)
    return nil
}

type SmsSender struct{}

func (ss *SmsSender) Send(message string) error {
    fmt.Println("SMS is sending...", message)
    return nil
}

type LoggingSender struct {
    Sender
}

func (ls *LoggingSender) Send(message string) error {
    fmt.Println("Logging...")
    return ls.Sender.Send(message)
}

上の例では、

EmailSender

SmsSender、および LoggingSender という 3 つの構造タイプを定義しました。 EmailSender および SmsSender 構造タイプは、Sender インターフェイスの Send() メソッドを実装します。これら 2 つのタイプのインスタンスが Send() メソッドを呼び出すと、「電子メールが送信中です...」および「SMS が送信中です...」という情報がそれぞれ出力されます。 LoggingSender

構造型には、

Sender インターフェイスが埋め込まれ、Send() メソッドがオーバーロードされます。 LoggingSender構造体タイプの Send() メソッドは、「Logging...」を出力するステートメントを追加し、最後に埋め込まれた Sender インターフェイスを呼び出します。 ##Send() メソッドを使用して、特定の送信操作を完了します。このようにして、単純なデコレータ パターンが実装され、メッセージ送信時にログ機能を追加できます。 <pre class='brush:go;toolbar:false;'>func main() { emailSender := &amp;EmailSender{} smsSender := &amp;SmsSender{} loggingEmailSender := &amp;LoggingSender{Sender: emailSender} loggingSmsSender := &amp;LoggingSender{Sender: smsSender} loggingEmailSender.Send(&quot;Hello, world!&quot;) loggingSmsSender.Send(&quot;Hello, Golang!&quot;) }</pre><p>在这个例子中,我们创建了一个<code>EmailSender类型和一个SmsSender类型的实例,并且利用LoggingSender类型来装饰它们。我们可以调用装饰后的实例的Send()方法来发送消息,并且会在输出中看到"Logging..."的信息。

结语

本文介绍了Golang中结构体类型嵌入的应用技巧,并以几个简单的实例来说明如何利用嵌入类型实现代码重用、"继承"和装饰器模式等功能。当然,在实际的开发中,结构体类型嵌入还有很多其他的应用场景,需要根据实际需求进行灵活运用。

以上がGolang関数に構造体型の応用スキルを埋め込むの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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