Go (プログラミング言語)
Goではtype構文を利用して既存の型から新しい型を定義できる。
次の例では、int型を元に MathInt という新しい型を定義している。
これはC/C++におけるtypedefやC#におけるusingエイリアスディレクティブと違い、単に既存の型に別名を与えているのではなく、元のint型と別の型を定義している点が大きく異なる。
新しく定義した型であれば、元の型が構造体型でなくともメソッドを追加することができる。例えばint型やマップ型といった事前定義済み型 (組み込み型) に対してもメソッドを追加することが可能である。
事前定義済み型から新しい型を定義した場合、例えば下記のような記述が可能となる。
Go 1.9ではtypeキーワードを利用した型エイリアス (type alias) 構文が別途追加された。こちらはC/C++のtypedefやC#のusingエイリアスディレクティブと類似の機能である。
Goではdefer文という例外安全な強制実行のしくみを採用している。
defer文は、deferキーワードに続けて、関数呼び出しまたはメソッド呼び出しを記述することで関数終了時に指定した処理の呼び出しを実行する。
ファイルのオープンとクローズなど、組になる作業で両方行われる必要があるものに多く使われる。
deferは下記の様に記述する。
deferはブロックを持たず入れ子が深くなるようなことはない。ただし、関数以外のブロックを無視する点に注意が必要である。例えばループ中でdeferを使用した場合、ループ内では指定した関数が呼ばれず関数終了時にdeferで指定した全ての関数呼び出しが行われる。
deferには、関数呼び出しまたはメソッド呼び出ししか記述できず、式や文を直接記述することはできないが、下記のように無名関数の即時実行を利用して、任意の式や文の実行も可能である。
型の継承、アサーション、オーバーロードといった機能をあえて提供していない。FAQにおいてオーバーロードは効率的見地から排除されたことが述べられている。関数は多値を返すことができるので、それによりエラーの報告は容易である、としている。