Golang における継承の理解
Olivia Novak
Dev Intern · Leapcell

Key Takeaways
- Golang は伝統的な継承をサポートしていませんが、コードの再利用のために構造体の埋め込みを使用します。
- メソッドのオーバーライドは、埋め込み構造体で同じ名前のメソッドを定義することで実現できます。
- インターフェースはポリモーフィズムを可能にし、異なる型が共通の動作を共有できるようにします。
継承はオブジェクト指向プログラミング(OOP)の基本的な概念であり、あるクラスが別のクラスのプロパティと動作を取得できるようにします。ただし、Golang(Go)は、Java や C++ などの言語にあるような従来のクラスベースの継承をサポートしていません。代わりに、Go は コンポジション と インターフェースの埋め込み を使用して、同様の機能を実現します。
継承よりもコンポジション
Go では、構造体の埋め込みは、継承のような動作を実現するための主要なメカニズムです。Go はクラスベースの階層を使用する代わりに、コンポジションを推奨しており、構造体は別の構造体を含めてそのフィールドとメソッドを再利用できます。
構造体の埋め込みの例
package main import "fmt" // ベース構造体 type Person struct { Name string Age int } // Person のメソッド func (p Person) Greet() { fmt.Printf("こんにちは、私の名前は %s です。\n", p.Name) } // Person を埋め込む Employee 構造体 type Employee struct { Person Position string } func main() { emp := Employee{ Person: Person{Name: "アリス", Age: 30}, Position: "エンジニア", } // 埋め込まれた構造体のフィールドに直接アクセス fmt.Println(emp.Name) // アリス fmt.Println(emp.Age) // 30 fmt.Println(emp.Position) // エンジニア // 埋め込まれた構造体からメソッドを呼び出す emp.Greet() // こんにちは、私の名前はアリスです。 }
ここでは、Employee
が Person
を埋め込んでいるため、明示的なサブクラス化なしにそのフィールドとメソッドを継承できます。Person
の Greet()
メソッドは、埋め込みのために Employee
からアクセスできます。
埋め込み構造体でのメソッドのオーバーライド
Go には明示的なメソッドのオーバーライドはありませんが、埋め込み構造体で同じ名前のメソッドを定義することで、同様の効果を実現できます。この場合、埋め込み構造体のメソッドが優先されます。
package main import "fmt" type Person struct { Name string } func (p Person) Greet() { fmt.Println("Person からこんにちは") } type Employee struct { Person } // Greet メソッドのオーバーライド func (e Employee) Greet() { fmt.Println("Employee からこんにちは") } func main() { emp := Employee{Person: Person{Name: "ボブ"}} emp.Greet() // Employee からこんにちは }
この例では、Employee
は独自の Greet()
メソッドを定義しており、Employee
インスタンスで呼び出されたときに Person
からのメソッドをオーバーライドします。
ポリモーフィズムのためのインターフェースの使用
Go はインターフェースを通じてポリモーフィズムをサポートしています。インターフェースを定義し、それを異なる構造体で実装することで、継承と同様の動作を実現できます。
package main import "fmt" type Greeter interface { Greet() } type Person struct { Name string } func (p Person) Greet() { fmt.Printf("こんにちは、私は %s です。\n", p.Name) } type Robot struct { Model string } func (r Robot) Greet() { fmt.Printf("ビー プー、私は %s です。\n", r.Model) } func SayHello(g Greeter) { g.Greet() } func main() { p := Person{Name: "アリス"} r := Robot{Model: "X100"} SayHello(p) // こんにちは、私はアリスです。 SayHello(r) // ビー プー、私は X100 です。 }
ここでは、Person
と Robot
の両方が Greet()
メソッドを定義することにより、Greeter
インターフェースを実装しています。SayHello
関数は Greeter
を実装する任意の型で動作し、Go がポリモーフィズムを実現する方法を示しています。
結論
Go は古典的な継承をサポートしていませんが、構造体の埋め込みやインターフェースなどの強力なメカニズムを提供して、コードの再利用とポリモーフィズムを促進します。継承よりもコンポジションを優先することで、Go はプログラムの構造化においてより優れた保守性と柔軟性を保証します。
FAQs
いいえ、Golang は従来の継承の代わりに、構造体の埋め込みとインターフェースに依存しています。
埋め込み構造体で同じ名前のメソッドを定義すると、そのメソッドが優先されます。
インターフェースはポリモーフィズムを可能にし、異なる型が直接継承なしに同じ動作を実装できるようにします。
Go プロジェクトのホスティングには、最高の Leapcell をお選びください。
Leapcell は、Web ホスティング、非同期タスク、および Redis 向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、または Rust で開発できます。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金が発生し、リクエストも課金もありません。
比類のないコスト効率
- アイドル料金なしの従量課金制。
- 例:$25 で平均応答時間 60ms で 694 万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的な UI。
- 完全に自動化された CI/CD パイプラインと GitOps の統合。
- 実用的な洞察を得るためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティと高性能
- 高い並行処理を簡単に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
X でフォローしてください:@LeapcellHQ