Go (プログラミング言語)
Goにはユーザー定義の複合型を記述することのできる構造体の機能があり、下記のように記述する。
上記の例では、nameおよびageというフィールドを持つPerson構造体の型を定義し、さらにその構造体に対応するPrintName()およびPrintAge()というメソッドを定義している。GoにはJavaのような言語が持つクラスやオブジェクトのような概念は無いが、実質的には構造体はそれらに近い役割を提供する。
Goでは、関数に(m *Person)のようなレシーバーの宣言を追加してメソッドを定義する。レシーバーの宣言は (変数名 型名) と記述する。レシーバー内の変数名は自由に指定が可能であり、受け取り方は値渡し、ポインター渡しの2種類から指定できる。
型とメソッドが切り離されており、型は一切メソッドに依存しない。メソッドと型は、メソッドの追加対象となる型名をレシーバーの型名に指定することで関連付けるようになっている。メソッドは型から切り離されているため型本体を変更する事なくメソッドを追加することが可能であり、同一パッケージ内限定ではあるが、開放された型を実現している。
Goには型自身を初期化したり終了したりする機能が存在しない。つまりJavaの静的イニシャライザやC#の静的コンストラクタに相当する機能がない。初期化は型に所属しない関数や、他の型のメソッドで行うようになっている。