Go (プログラミング言語)
Goはインターフェース型の値から、基底型の値(インターフェース型に変換される前の型の値)を動的に安全に得るダウンキャストの仕組みとして「型アサーション」と呼ばれる機能を備えている。
標準パッケージのreflectを使うことで、対象の値型やその値などの詳細を得ることができる。
松木雅幸、mattn、藤原俊一郎、中島大一、上田拓也、牧大輔、鈴木健太:「改訂2版 みんなのGo言語」、技術評論社、ISBN 978-4-297-10727-7(2019年8月1日)。
Alan A.A.Donovan, Brian W.Kernighan 著、 柴田芳樹 翻訳:「プログラミング言語Go」、丸善出版、ISBN 978-4-621-30025-1(2016年6月20日)。
Goのtourを直接ダウンロードして、オフラインで学習することも可能である。方法としては、まずオフィシャルサイトから最新版のgo-langをダウンロードしてインストールした後、go install golang.org/x/website/tour@latestを実行することで必要最小限のファイルがダウンロードされる。その後、tourを実行することで、オフラインでGoの文法を学ぶことができる。
Goには名前とモジュールを管理するために、パッケージという仕組みを持っている。
基本的なパッケージの使用例を下記に示す。
Goには多彩なimport文が存在するが、その構成要素は、別名の指定とGoのソースを格納したフォルダーの指定(またはパッケージバイナリー)という非常に単純なものである。Goでは名前管理とモジュールの取り込み指定を一つの構文にまとめる事で、他の言語では煩わしいモジュールの結合を簡潔なものとしている。
Goの名前管理の特筆する点として名前解決の方法として階層型の名前空間ではなく別名の仕組(のみ)を採用している点が挙げられる。名前解決をするために長い名前を記述する煩わしさはない。
更にGoにはモジュール管理の点でも特筆すべき点がある。Goはソースファイル中に一つ初期化関数(init)を定義する事で、初期化関数により実行時に広域変数を初期化できるという機能を持っている。この初期化関数が呼ばれるソースファイルは、main関数の定義されたソースファイルから連鎖的にimportされたパッケージに含まれるソースファイルだけである。この特性により使う予定もないのに初期化コードが実行されるおそれはない。また、パッケージが初めて参照されるまで初期化が遅延されてしまうという事もない。
次のサンプルプログラムは、Goの並行性機能をデモンストレーションする非同期プログラムの実装である。2つの"goルーチン"(軽量スレッド)を立ち上げている。一方はユーザーがテキストを入力するのを待機し、他方はタイムアウトを実現する。select文が2つのgoルーチンがメインルーチンにメッセージを送信するのを待機し、最初に到達したメッセージに対して動作を実行する(コード例はDavid Chisnallの本のコードを一部修正している)。