この記事は社内にてGo言語のプレゼンを行うために作成した資料です。
ちなみに、自分はUDPで通信するデバイスのエミュレーションをするのにGo言語を使っていました。
Go言語とは?
- Googleによって開発されている
- Go、Go言語、golangなどと呼ばれる
- 発表されたのは2009年であり、かなり"若い"言語である
- マスコットはGopher君
Go言語のすごいところ
- 静的型付け
- コンパイル速度が速い
生産性が高くシンプルな文法
package main
import "fmt"
func main() {
var m string = "Hello, world"
fmt.Println(m)
}
- セミコロンなし
- 型は後置
- 多値返却できる
- 型推論
- 上記の
var m string = "Hello, world"
はm := "Hello, world"
とも書ける
- 上記の
標準のパッケージや言語仕様による機能が便利
- HTTP、TCP、UDP、正規表現等を扱うパッケージが標準で用意されている
- goルーチンと呼ばれる軽量スレッド実行機能により並行処理が簡単に行える
package main
import (
"fmt"
"time"
)
func readword(ch chan string) {
fmt.Println("Type a word, then hit Enter.")
var word string
fmt.Scanf("%s", &word)
ch <- word
}
func timeout(t chan bool) {
time.Sleep(5 * time.Second)
t <- true
}
func main() {
t := make(chan bool)
go timeout(t)
ch := make(chan string)
go readword(ch)
select {
case word := <-ch:
fmt.Println("Received", word)
case <-t:
fmt.Println("Timeout.")
}
}
-
go
をつけて実行された関数は非同期で実行され、結果はchannel
を介して受け取る- C#などの
async/await
と異なるMessage passing型の並行処理モデル
- C#などの
標準のツールが便利
-
go fmt
- コード整形
-
go vet
- 静的解析
サードパーティ製の開発用ツールも豊富。
クロスコンパイル/ワンバイナリ
- ビルドするとひとつのバイナリファイルになり、他のランタイムライブラリ等は不要
- Windows/Linux/macOS向けのクロスコンパイルが可能
いまいちなところ
- 文法に癖がある
- 例外がない(推奨されない)
- クラスがない
- 継承がない
- オーバーロードがないなど
- ジェネリクスがない
- バイナリサイズが大きい
- 依存関係周り
-
vgo
で解決されるようになるらしい → 1.12 (2019年2月予定) - Go & Versioning(vgo)を読んで大きな変更が入ったなと思った - Qiita
-
Go言語の採用例
参考: Go言語を採用している有名なオープンソースのプロダクト - write.kogu
- CLIツール
- コンテナ、インフラ管理など
始めるには?
- 公式サイトに従ってインストール
- A Tour of Goで文法を学習
- 困ったらドキュメントを参照