概要
- Gocci.meと言うサービスをGo言語で開発しており、そのGo言語の持つ特徴をまとめました
言語設計と文法
シンプル
Go言語はいろいろな書き方が存在するわけではなく、ある程度書き方が決まっているので、シンプルに実装することができます。
比較的昨日の割には言語仕様を理解しやすくなっています。
コンパイル言語
コンパイル言語とは実行をする前に一括で全てのコードを機械語もしくは中間言語にコンパイル(翻訳)する言語のことです。
コンパイル言語は記述方法が厳密と言う特徴がありますが、一括で機械語に変換してコンピュータに処理させるため、処理が高速であると言う特徴を持ちます。
Go言語はコンパイル速度も早いと言われています。
静的型付け
Go言語ではプログラムを書く際に予め型を指定しなければいけません。
静的型付けは事前にコンパイルを行うことで、プログラムの実行時には型の生合成チェックをする必要がなく、処理が高速になります。
また、コンパイル時に型のチェックを行うため、型の整合エラーをチェックできます。
JavaやC言語がこの特徴を持っています。
対してプログラムを書く際に型付けを行わない動的型付け言語が存在します。
JavaScriptやRubyやPythonなどが動的型付け言語になります。
これらは処理は高速ではありませんが、プログラムの記述量が少なく、文甫の学習コストが低いため、直感的にコードを書くことができます。
並行プログラミング
ゴールーチン
処理を仮想スレッドで起動する機能のことで、軽量なスレッドのイメージです。
goキーワードをつけて関数を呼び出すことで実現できます。
func main() {
go f() // ゴールーチンの呼び出し
}
func f() {
// some task
}
ゴールーチンでは関数に戻り値を設定することができません。
ゴールーチンでは処理が完了されると破棄されます。
チャネル
ゴールーチンのみでは作業中か破棄されたのかを検知することができないため、意図しない挙動が発生した時にエラーハンドリングなどができません。
また、戻り値がないので、作業の結果として加工した値を受け取ることもできません。
そこでチャネルと言う機能によって、ゴールーチン間のデータのやりとりを可能にします。
チャネルの受信を記述することで、値が送信されるまで待ってくれます。
チャネルはバッファを持たせることもでき、作成時にバッファを指定すると、チャネルが持てるデータの個数が決まります。(デフォルトは0)
バッファを超えて値を送信すると、送信ブロッキングが発生します。
豊富な標準ライブラリ
Go言語には標準ライブラリが豊富に揃っています。
シングルバイナリ・クロスコンパイル
Go言語では異なるOSやアーキテクチャ向けのバイナリを作ることができます。
下記のように環境変数のGOOSとGOARCHを指定することで実現可能です
# Windows(32bit)向け
$ GOOS=windows GOARCH=386 go build
# Linux(64bit)向け
$ GOOS=linux GOARCH=amd64 go build
Go言語で書かれたプログラムは基本的には単体で実行可能なシングルバイナリとして生成されます。
一旦コンパイルしてしまえばLL言語(短い記述で処理を実現できる言語)などで必要なランタイムや依存関係の管理が必要なくなり、動作環境を用意しなくていいと言う特徴があります。