Go言語はじめの一歩

はじめに
Goは2009年にGoogleよりリリースされた、オープンソースのプログラミング言語です。C言語のように高速な実行速度とスクリプト言語のような生産性を併せ持つGoは、近年、各種Webサービスのバックエンド開発やインフラ領域で利用され、注目されつつあります。
国内企業でもGoを採用する事例が増えており、それぞれの知見を共有するために、各地で勉強会なども行われるようになってきました。このようなGo人気の高まりを受けて、「まだ触ったことはないけれど興味はある」という方も多いのではないでしょうか。
本連載ではそういった方を対象に、Goの基礎部分に触れながら、実際にWebアプリケーションを作成するまでを解説します。
第1回目の今回は、Goとはどのような言語なのかを紹介し、実際にかんたんなプログラムを動かしてみます。
Goとは
元々Googleの内部的なプロジェクトとして始まったGoは、2009年にリリースされた比較的新しい言語です。ローレベル言語とスクリプト言語の中間のような位置付けで、CやC++の領域で、スクリプト言語のような生産性を獲得することがGoの誕生理由でした。
Goには以下のような特徴があります。
シンプルな言語仕様と厳格なルール
Goには他言語のループ処理でおなじみの「while」や「do/while」が存在せず、三項演算子もありません。意図的にシンプルな言語仕様を保っています。
その一方で厳格なルールを敷いており、利用していない変数やパッケージがコードに存在するとコンパイルすることすらできません。また、言語として標準のコーディング規約も定められています。
これらのシンプルな言語仕様と厳格なルールの数々は、他の言語を経験している方にとって違和感を覚える点でもあります。ですが、実際にGoのコードを書いてみると、これらがコードの可読性や再利用性に良い影響を与えていることに気付くはずです。
また仕様がシンプルであることは、学習コストの低さにも繋がりますし、コーディング規約などの厳格なルールは、開発者の好みによる意見衝突を排除します。
なによりも、複雑化する昨今のプログラミング言語において、Goのシンプルさは他にはない魅力的な点と言えるでしょう。
マルチプラットフォーム/クロスコンパイル
Goはマルチプラットフォーム対応の言語ですが、各プラットフォームの差異を吸収する仮想マシンを利用しておらず、ビルドされる実行ファイルは各環境のネイティブコードになります。コンパイル時には、ひとつのコンパイル環境から各環境の実行ファイルをビルドできるので、プラットフォームごとにそれぞれのコンパイル環境を用意する必要はありません。
速度
Goは速度の点でも利点があります。処理の得手不得手はあるので一概には言えない部分もありますが、ネイティブコードで実行されるGoは、大抵のスクリプト言語よりも速度面で有利です。また、オフィシャルのドキュメントでも述べられているとおり、Goはコンパイル速度も高速です。これは、前述のシンプルな言語仕様も影響しています。
並行処理
並行処理のサポートは、Goの大きな特徴のひとつです。Goでは「ゴルーチン」という並行処理のしくみと、「チャネル」というデータ共有の機能によって、通常は記述の難しい並行処理を手軽に書くことができます。この並行処理の手軽さという点だけを見ても、Goを利用する十分な理由になり得ます。
並行処理については、次回以降に詳しく解説します。
豊富な標準パッケージ、ツール
言語仕様はシンプルなGoですが、標準パッケージは充実しています。HTTPクライアント/サーバ機能や、ファイルの圧縮、暗号化やテストなどが標準のパッケージとして用意されているため、外部のパッケージを利用しなくても十分に開発を行うことができます。
また、Goは標準パッケージだけでなく、各種ツール類も充実しています。ツール類を活用すれば、ソースコードを標準の規約に沿って整形したり、ソースコード内のコメントからドキュメントを作成することも容易です。これらのツール群が公式に用意されていることは、開発時の利便性の向上に留まらず、チーム開発におけるフォーマットの統一という点でも大きな利点になるでしょう。
Hello, world
それでは、実際にプログラムを動かしてみましょう。
インストール
Goをインストールする方法はいくつかありますが、ここでは公式に配布されているインストーラを使用します。公式サイトのダウンロードページから自身の環境のインストーラをダウンロードし、実行してください。
インストーラ経由でインストールを行った場合、PATH環境変数が自動的に追加されます。具体的には、Windowsであれば「C:¥Go¥bin」が、macOSであれば「/usr/local/go/bin」が設定されることになります。すでにコマンドプロンプトやターミナルなどのコマンドラインツールを開いている場合は、再起動して変更を有効にしてください。
インストールが完了したら、環境変数GOPATHを設定します。GOPATHは、Goのソースコードやライブラリが格納されるワークスペースのPATHです。指定先は自由(上記の自動設定されたPATHを除く)ですが、ここではホームディレクトリの下を指定してみます。
標準的な環境の場合、Windowsであれば「C:¥Users¥ユーザー名」の下に「go」フォルダを作成し、環境変数を設定します。変数名は「GOPATH」、変数の値は「C:¥Users¥ユーザー名¥go」です。macOSであれば、ターミナル上で下記のように設定します。
リスト1:macOSでの環境変数設定
1 | $ mkdir $HOME/go |
2 | $ export GOPATH=$HOME/go |
設定が完了したら、Goが正しくインストールされているか確認してみましょう。コマンドラインツール上で「go version」コマンドを実行してみてください。正しくインストールされていれば、下記のようにバージョン情報が表示されるはずです。
リスト2:正しくインストールされていることを確認
1 | $ go version |
2 | go version go1.x.x darwin/amd64 |
動かす
環境設定が完了したら、早速プログラムを書いてみます。下記の内容を「hello.go」という名前で保存してください。
リスト3:最初のプログラムhello.go
1 | package main |
2 |
3 | import "fmt" |
4 |
5 | func main() { |
6 | fmt.Printf("hello, world!\n") |
7 | } |
1行目はパッケージ宣言を記述しています。Goではすべてのプログラムは、なんらかのパッケージへ属することになります。ここでは、プログラムのエントリーポイントとなるmainを指定しています。
3行目では、文字列の入出力に利用するfmtパッケージをインポートしています。特に読み込むパッケージがない場合は、この記述は省略できます。
最後のmain関数内では、fmtパッケージの関数printfを呼び出すことで、標準出力に文字列を出力しています。
それでは実際にプログラムを動かしてみましょう。と言いたいところなのですが、その前にGoが備えているツールを試してみます。
ここでは「go fmt」を使用します。コマンドラインツール上で「hello.go」ファイルを指定し、「go fmt」コマンドを実行してみてください。
リスト4:go fmtコマンドを実行
1 | $ go fmt hello.go |
上記のサンプルと同じようにインデントをソフトタブ(半角スペース)で記述していた場合は、ハードタブ(タブ文字)に変換されたのではないでしょうか。
「go fmt」は、ソースコードを規約に沿って整形するツールです。 Goのコーディング規約では「インデントはハードタブとする」ように定められていますので、このようにコードが整形されるわけです。「go fmt」を使用すればソースコードをかんたんに整形できるので、事前にコーディング規約を覚えなくても大丈夫です。
では最後に「hello.go」のプログラムを実行してみましょう。コマンドラインツール上で「go run」コマンドを実行します。下記のように表示されれば、無事成功です。
リスト5:hello.goを実行
1 | $ go run hello.go |
2 | hello, world! |
まとめ
今回は、Goの主な特徴について解説しました。Goがどういった言語なのか、少しでもお伝えすることができていれば幸いです。次回は、Goの基本的な文法について触れながら、もう一歩進んだプログラムを作成する予定です。
(編注:2017年2月9日16時00分更新)記事公開当初、一部に「並列処理」という記述がありましたが「並行処理」の誤りだったためお詫びして訂正致します。