UnleashZealUpliftPersevereOvercomeDrive

Goの構造体とPythonのクラスの違い

プログラミング言語には、それぞれ異なるデータ構造やオブジェクト指向の概念があります。
この記事では、Go言語の「構造体(struct)」とPythonの「クラス(class)」の違いについて情報を整理しました。

1. データとメソッドの組み合わせ

<Goの構造体>
Goの構造体は、データ(フィールド)を保持するためのカスタムデータ型。
構造体そのものにはメソッドを直接含めませんが、構造体型に対してメソッドを定義することができます。

type Person struct {
    Name string
    Age  int
}

func (p *Person) Greet() string {
    return "Hello, " + p.Name
}

<Pythonのクラス>
Pythonのクラスは、データ(属性)とその操作を行うメソッドを一つにまとめたもの。
クラス内でメソッドを定義し、インスタンスを通じてそれを呼び出すことができます。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"Hello, {self.name}"

p = Person("Alice", 30)
print(p.greet())

2. 継承

<Goの構造体>
Goの構造体は、クラスベースの継承をサポートしていない。
代わりに「埋め込み」や「コンポジション」を使用してコードの再利用を行います。

type Employee struct {
    Person
    EmployeeID string
}

<Pythonのクラス>
Pythonのクラスは継承をサポートしており、親クラスの機能を子クラスに引き継ぐことができる。
また、多重継承も可能です。

class Employee(Person):
    def __init__(self, name, age, employee_id):
        super().__init__(name, age)
        self.employee_id = employee_id

3. ポリモーフィズム(多態性)

<Goの構造体>
Goでは、インターフェースを使ってポリモーフィズムを実現する。
インターフェースはメソッドの集合を定義し、それを実装する任意の構造体がそのインターフェースを満たすと見なされます。

type Greeter interface {
    Greet() string
}

<Pythonのクラス>
Pythonでは、継承とメソッドのオーバーライドを使ってポリモーフィズムを実現する。
また、"duck typing"により、特定のインターフェースを持つ必要はないようです。
※duck typeing(ダックタイピング): メソッドや属性を利用することで、オブジェクトの型を決定するポリモーフィズム(多態性)を実現する手法の一つ

class Bird:
    def fly(self):
        print("Flying")

class Airplane:
    def fly(self):
        print("Flying high in the sky")

def take_off(flying_object):
    flying_object.fly()

take_off(Bird())     # Output: Flying
take_off(Airplane()) # Output: Flying high in the sky

4. メモリ管理

<Goの構造体>
Goは静的型付け言語で、構造体のメモリはスタックまたはヒープに割り当てられる。
ガベージコレクタがメモリを管理し、必要に応じて自動的に解放します。

<Pythonのクラス>
Pythonは動的型付け言語であり、すべてのオブジェクトはヒープ上に作成される。
Pythonのガベージコレクタが不要になったオブジェクトを自動的に解放します。