Goは2009年にGoogleが開発したオープンソースの静的型付けプログラミング言語です。大規模なアプリケーションに対応するため、高速で信頼性が高く、効率的な設計になっています。
Goは、Googleのソフトウェアの複雑性を解決するために設計されました。最小限のデザインで、読み書きが簡単であることが特徴となります。C言語の特徴を多く受け継いでおり、厳格な静的型付け言語となっています。
しかし、後追いの言語ということもあり、ガベージコレクション、パッケージ、インターフェースなど、他の言語と共通する機能も持っています。さらに、Go言語にはコードを書く際の明確な規則があります。曖昧で自分勝手な記述は許されず、誰が書いても同じような記述になるというのが大きな特徴です。
Goプロジェクトはオープンソースであるため、様々な周辺ツールが利用可能です。Goの標準パッケージを使えば、ほとんどすべての種類のアプリケーションを構築することができます。
Goはコンパイル言語です。Goの場合、Pythonのようなインタプリタ型言語のようにコードを直接実行するわけではありません。その代わりに、まずコードをコンパイルします。コンパイルとは、書いたコードをコンピュータが理解し実行できる形に変換することです。このコンパイルの結果が、コンピュータで実行できる実行ファイルです。
Goプログラムを実行するには、go runというコマンドを使います。まずは、cdコマンドを使用して、Goファイルがあるディレクトリに移動します。例えば、ファイルが /home/user/goprojectsディレクトリにある場合、次のように実行します。
cd /home/user/goprojects
ディレクトリ内のprogramというGoのファイルを実行する場合、以下のコマンドを実行します。
go run program.go
go runは、Goソースファイルのコンパイルと実行を一度に行うために使用されます。
一方、Goのソースファイルを実行可能なバイナリファイルにコンパイルするには、go buildというコマンドが使われます。
go build program.go
Pythonなどのインタプリタ型言語とGoなどのコンパイル型言語の大きな違いは、インタプリタ型言語の場合はコードを一行ずつ実行するのに対し、コンパイル型言語の場合はソースコード全体を機械語にコンパイルしてから実行する点です。
一般的に、コンパイル言語は実行する前にコンパイル処理を挟むため、実行まで時間がかかるのが特徴ですが、 Go言語は同じコンパイル言語であるCやC++などに比べて非常に高速であり、軽量言語のような軽さがあります。
また、コンパイルによって生成された実行可能ファイルは、単一のバイナリファイル(シングルバイナリ)になるという特徴があります。つまり、ただのバイナリファイルが生成されるだけなので、特別な実行環境は必要なく、このバイナリファイルを任意の環境で実行すればGoのプログラムを実行させることができます。これは近年主流のコンテナへのデプロイや、コマンドラインツールの開発/配布などにとって非常に便利な特徴となっています。
更に、Goは開発環境とは違うOSなどへのクロスコンパイルもできるという特徴も合わせ持っています。例えば、MacOSでWindows向けの実行可能ファイル(シングルバイナリ)を作ることができます。 つまり、MacOSでWindows向けのツールの開発を行なったり、WindowsでLinux向けのツールを開発したりと、様々な環境に適した開発が可能となっています。
Go言語の最大の特徴の一つが並行処理です。
並行処理とは、コンピュータプログラムが、利用可能なリソースを複数のプロセスまたはスレッドに分割することによって、複数のタスクを同時に処理する能力を指します。これは、複数のクライアントからのリクエストを処理したり、大量のデータを処理したり、複雑な計算を行う必要があるアプリケーションにとって重要です。
Goのプログラムは、ゴルーチン(goroutine)と呼ばれる軽量な実行スレッドの上で動作しており、Go言語はこのゴルーチンを生成・管理することで並行処理を実現しています。
ゴルーチンというのはGo特有の仕組みで、他の言語には見られないような特徴となっています。一般的に、並行処理や並列処理を行う場合、スレッドやプロセスを複数作成し実現させていく場合が多いと思いますが、Go言語の場合、複数のゴルーチンを任意のスレッド上に配置させ、そのゴルーチン上で関数を実行させることにより並行処理を実現させています。
また、Go言語のランタイムが、このゴルーチンを上手く配置・スケジュールしてくれているため、開発者はGo言語の仕組みを使い、簡単に並行処理を実装させることができます。
これは、複数の人が同時に異なるタスクに取り組むようなものだと考えてください。各人が他の人に邪魔されることなく、自分のタスクに取り組むことができます。ゴルーチンも同じです。ゴルーチンは互いに独立して実行され、Goランタイムがその管理をします。
Note: Goランタイムは、Goプログラムを実行するために必要なリソースとサービスを提供するソフトウェア層です。ランタイムはメモリの管理、ゴルーチンの実行スケジュール、その他の基本的なサービスをGoプログラムに提供します。GoランタイムはGoコンパイラと統合されており、標準のGoディストリビューションの一部なので、別途何かをインストールする必要はありません。Goプログラムを実行すると、Goランタイムが自動的に起動し、プログラムの実行に必要なリソースとサービスが提供されます。
例えば、PythonやJavaなどで並行処理や並列処理を行う場合、パッケージやクラスなどの外部ツールを利用して実装していくケースが多いと思いますが、 Go言語の場合、言語自体がゴルーチンを管理・実行してくれるので、並行処理の実装のために新しく外部パッケージなどを使用する必要は基本的にありません。
Goにおける並行処理は、goキーワードを使用することで簡単に実現できます。関数呼び出しの前にgoキーワードを使うと、その関数は別のゴルーチンとして実行されます。
func processData(data []int) {
// 何らかの処理
}
func main() {
data := []int{1, 2, 3, 4, 5}
go processData(data)
}
この例では、関数呼び出しの前にgoキーワードを使用すると、関数processDataが別のゴルーチンとして実行されます。つまり、main関数の実行中に関数processDataが並行で実行されます。