Go 言語について
- 簡単に Go 言語を紹介します。
概要
- 2009 年生まれ。Google 製。C/C++ の置き換え目的らしい。
- 型ある。コンパイルする。手続き型。
- シンプルな言語仕様を保つことにこだわっている。
- とはいえ、型推論などのモダンな一面も。
- 便利な C 言語と言って良いかもしれない (個人的な感想です)
- 組み込みからサーバまで、広く使われているプログラミング言語
Go 言語のマスコットキャラクターの Gopher くん
シンプルな言語仕様
- 構造体はあるがクラスはない
- C 言語ライク。C 言語知ってる人からしたら学習コスト低い
- ループは for しかない
- ポインタはあるけど演算できない
- ジェネリクスない
- クラスないということで継承もない
- 三項演算とか if 式もない
C に比べて便利なところの例
- 型推論
- 宣言した変数は自動的に初期化される
- 戻り値複数返せる
- 一気に複数代入できる
- インターフェースを用いたダックタイピング
- GC ある
コード例
- いわゆるハローワールド
package main
import fmt
func main() {
fmt.Println("Hello world!")
}
- 余分な部分があるとコンパイル通らない例
package main
import (
"fmt"
"os" // 使ってないインポートあるとコンパイル通らない
)
func main() {
i := 5 // 使ってないやつ変数があるとコンパイル通らない
for { // 無限ループしようと思っても while ないので for 使う
fmt.Printf("hello, world\n")
}
}
ポータビリティ
- Go 言語で書いたソースコードはビルドによって一個の実行可能バイナリになる
- 依存関係をバイナリに抱え込んでいるので、ちょっと古い Linux とかでも動く
- ただちょっとバイナリサイズがおっきくなりがち
- 特別な動作環境はいらない (e.g. python、nodejs、ruby)
- クロスコンパイルが充実。
- darwin、linux、windows、arm、mips、等などで動くバイナリを生成可能
- 依存関係をバイナリに抱え込んでいるので、ちょっと古い Linux とかでも動く
バイナリサイズをちっさくする工夫
以下のようなビルドオプションを用いた最適化を行ったり、実行バイナリの圧縮だったりをすることで、ある程度小さくできる
ldflags="-w"
ldflags="-s"
- UPX (実行バイナリの圧縮)
- 1 MB 未満まで落とすことが出来る場合も
(参考) Goのバイナリサイズを削減する - そこはかとなく書くよん。
C 言語との親和性
- Go 言語で書いたソースを shared object、static library にする機能がある
- C 言語から Go 言語で作ったライブラリを利用することができる
- 逆に、Go 言語から C 言語で作ったライブラリを利用可能 (cgo という機能)