はじめてのGo―シンプルな言語仕様,型システム,並行処理

第1章 Go言語の特徴と環境構築―Googleが作った新言語

この記事を読むのに必要な時間:およそ 5 分

特集のはじめに

Goは,2009年にGoogleにより発表されたオープンソースのプログラミング言語です。C言語の開発者Ken Thompson,UTF-8の開発者Rob Pike,memcachedの開発者Brad Fitzpatrickといった名だたるエンジニアによって開発されています。

Goはシンプルな言語仕様であるため学習が比較的容易で,豊富な標準パッケージが同梱されているためすばやく目的を達成できます。また,巨大なコードでも高速にコンパイルできるため大規模開発にも適しており,Windows,OS X,Linuxなどの環境に合わせた実行ファイルを生成するクロスコンパイルのしくみがあるため作成したプログラムを容易に配布できます。並行処理のサポートも充実しており,ミドルウェアの開発などにも適しているとされています。

本特集では,2014年6月にリリースされた最新バージョンであるGo 1.3をベースに,本章でGoの特徴や環境構築,2章で基本文法,3章でGoでの型の考え方,4章で代表的な標準パッケージ,5章では並行処理のノウハウについて徹底解説します。

なお,本特集のサンプルコードは,WEB+DB PRESS Vol.82のサポートサイトから入手できます。

言語の特徴

Goは,CやC++などが使用されるシステムプログラミングの領域で,より効率良くプログラムを書くことを目的に作られました。巨大なコードベースのプロダクトを,多人数の開発者によって開発・メンテナンスするような場面で,品質を保つための工夫が随所に施されています。

以降ではGoの基本的な特徴を紹介します。

言語をシンプルに保つ

Goは,ほかの言語が持つような機能の多くを削り,言語をシンプルに保っています。こうした機能の排除は,コンパイルの高速化や,予期せぬミスを減らすことに役立っています。

最小限の構文

Goでは,繰り返し構文はfor文しかなく,while文やdo/while文などはサポートされていません。また条件分岐でも,ifの波括弧は省略できず,三項演算子もありません。こうした表現方法を制限することで,開発者による表現のばらつきを抑えることができます。

また,マクロのようなプリプロセスが必要な構文もサポートされていません。Goは巨大なコードベースも高速にコンパイルできるようにするため,コンパイルを遅くする原因となるこうした構文は極力取り込まない方針を採っています。

危険の回避

メモリリークの原因となりやすいポインタ演算や,意図せぬエラーの原因になる暗黙の型変換などは排除されています。

また,宣言されたものの使われていない変数や,インポートされたものの使われていないパッケージなどがコードに存在すると,コンパイルすら通りません。巨大なコードベースでは,コードを追加することよりもコードを削除するほうが,影響範囲が読みにくく難しいことがあります。そこでGoは不要なコードの存在をコンパイル時に検出することで,不要なコードが存在することを防いでいます。

例外の排除

RubyやJavaなど例外をサポートする言語では,関数呼び出しをtry/catch構文などで囲み,内部で発生した異常を例外として捕捉しますが,Goでは関数が多値を返せることを利用して,発生した異常を戻り値として呼び出し側に返す方針を採ります。また,ゼロ除算や配列の範囲外の添字へのアクセスなどでは,パニックとリカバという異常を処理するしくみを別途備えています。詳しくは2章で解説します。

特徴的な機能

Goは言語をシンプルに保つ一方で,近年のプログラミングに求められるモダンな機能は積極的にサポートしています。

クロスコンパイルのサポート

Goは,コンパイル時にOSとCPUアーキテクチャを指定し,その環境に合わせた実行ファイルを生成できます。詳細は本章のコラムで解説します。

並行処理のサポート

Goでは,ゴルーチンという軽量スレッドを用いて処理を並行に実施し,同時に実行されているゴルーチンの間ではチャネルという機能でデータをやりとりするしくみが備わっています。詳細は5章で解説します。

充実した開発環境

Goでは開発を助けるさまざまなパッケージやツールが最初から用意されており,さらに各エディタやツールのためのプラグインなども公開されているため,すぐに開発を始めることができます。

標準パッケージ

Goは標準パッケージが充実しており,外部のパッケージに頼らずともかなりの開発をカバーできます表1)⁠

標準パッケージの一覧は公式ドキュメントから確認できます。

表1 Goの主な標準パッケージ

パッケージ用途
archive,compresstar,zlibなどの圧縮やアーカイブ形式のサポート
cryptoAES,RSAなどの暗号化形式のサポート
databaseRDBへのSQLクエリインタフェースとドライバインタフェース
encodingJSON,XML,CSVなどのフォーマットのサポート
goGo言語自体のパーサやAST(抽象構文木)の取得
html,textHTMLやTEXT形式のテンプレート
netTCP,HTTP,RPC,SMTPなどのネットワークプログラミングのサポート
sync並行処理のためのロックや同期化のサポート
testingテストやベンチマークのサポート
ツールのサポート

Goには開発を支援するコマンドが同梱されており,さまざまなツールを使用できます表2)⁠

コマンドの解説は公式ドキュメントから確認できます。

表2 Goの主なコマンドラインツール

コマンド用途
go buildプログラムのビルド
go fmtGoの規約に合わせてプログラムを整形
go get外部パッケージの取得
go installプログラムのビルドとインストール
go runプログラムのビルドと実行
go testテストやベンチマークの実行
go tool yaccパーサをGoで出力するGo実装のyacc(パーサジェネレータ)
godocソースからドキュメントの生成
各エディタのサポート

Goでは,有志による主要なエディタやツールへのプラグインも公開されています注1)⁠公開されているエディタやプラグインはGoのWikiにまとめられています。

注1)
Go 1.2まではGoのリポジトリに含まれていましたが,現在はこうしたサポートはコミュニティ主導に移ることになりました。

著者プロフィール

コメント

コメントの記入