Golang 関数の構造型のアプリケーション スキルの埋め込み
Golang は、構造型の定義である「オブジェクト」のカプセル化をサポートする、厳密に型指定されたプログラミング言語です。埋め込み型を構造型で使用して、既存の型を拡張することもできます。 Golang では、埋め込み型は実際に、型の名前を別の構造型のフィールド型として使用します。
この記事では、構造型の埋め込みの応用スキル、具体的には、Golang 関数で型が埋め込まれた構造を使用する方法について説明します。
構造型の埋め込み
Golang に構造型を埋め込むには、主に 2 つの方法があります。1 つは構造型名を匿名フィールドとして使用する方法、もう 1 つは指定された型名を使用する方法です。ここでは主に最初の方法について説明します。
構造体の型名を匿名フィールドとして使用する場合、埋め込み構造体は匿名構造体のすべてのフィールドとメソッドを継承し、独自のフィールドとメソッドとして使用します。次の例を見てください:
type Animal struct { Name string Age int } type Person struct { Animal Gender string }
上の例では、2 つの構造タイプ Animal
と person
を定義します。ここで、Person
The 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 つのフィールド
Name と
Age。
構造型埋め込みを使用して「継承」を実装する
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
、Circle、
Rectangle という 3 つの構造タイプを定義しました。このうち、
Shape は基本クラス、
Circle と
Rectangle は、
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
Rectangle の
Draw() メソッドを呼び出しており、実際には継承を呼び出していることに注意してください。
Shape の
Draw() メソッド。これは、
Circle と
Rectangle 構造型の両方が
Shape 構造型を埋め込み、そのメソッドを継承しているためです。
構造型の埋め込みを使用してデコレータ パターンを実装する
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()
メソッドを使用して、特定の送信操作を完了します。このようにして、単純なデコレータ パターンが実装され、メッセージ送信時にログ機能を追加できます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:go;toolbar:false;'>func main() {
emailSender := &EmailSender{}
smsSender := &SmsSender{}
loggingEmailSender := &LoggingSender{Sender: emailSender}
loggingSmsSender := &LoggingSender{Sender: smsSender}
loggingEmailSender.Send("Hello, world!")
loggingSmsSender.Send("Hello, Golang!")
}</pre><div class="contentsignin">ログイン後にコピー</div></div><p>在这个例子中,我们创建了一个<code>EmailSender
类型和一个SmsSender
类型的实例,并且利用LoggingSender
类型来装饰它们。我们可以调用装饰后的实例的Send()
方法来发送消息,并且会在输出中看到"Logging..."的信息。
结语
本文介绍了Golang中结构体类型嵌入的应用技巧,并以几个简单的实例来说明如何利用嵌入类型实现代码重用、"继承"和装饰器模式等功能。当然,在实际的开发中,结构体类型嵌入还有很多其他的应用场景,需要根据实际需求进行灵活运用。
以上がGolang関数に構造体型の応用スキルを埋め込むの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。