- Google発のプログラミング言語
- 2009年発表
- Ken Thonmpson、Rob Pikeなど
- 特徴
- シンプルな言語仕様
- 開発環境の充実
- 豊富な標準パッケージ
- 高速なコンパイル
- Ver1.3(2014年6月)が最新版
- Docker
- dockerがGo製
- Google
- Google App Engine
- Goで書ける
- Google App Engine
- はてな
- Mackerel: 新しいアプリケーションパフォーマンスマネジメント
- クライアントがGo製
- Mackerel: 新しいアプリケーションパフォーマンスマネジメント
- もっと実例あったような気がするんですが、細かいところまではわからず
- グノシーが一部RubyからGolangに変えたという話
- 300万人をGoで捌いた話 // Speaker Deck
- peco
- 元々はpercolというのがあってそれをGolangで再実装したのがpeco
- Vim使ってる人がgolangでちょこちょこツール書いている様子が見受けられる
- データベースドライバ
- 標準パッケージ
- net/http
- html/template
- Martini
- RubyでいうところのSinatra
- go-martini/martini
- martini/README_ja_JP.md at master · go-martini/martini
- 日本語リファレンス
- Revel
- RubyでいうところのRails
- The Revel Web Framework for Go
- Goroutineつかって非同期でリクエストをさばいたり、パフォーマンス面でのアピールをしている
- goworker
- goworker
- Resqueと互換
- Resqueに突っ込んだデータをgoworkerで取ってきて処理
- Ruby baseのworkerより10倍から100,000倍速いとの謳い文句
raydive/voicetext_apiをちょっと見 ながら、ふんふんと聴いてください。
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
- package から始まる
- プログラムの開始はmain packageのmain関数から始まる
- importで他のパッケージを読み込む
- 複数パッケージならばこんなかんじ
import {
"fmt"
"hoge"
"fuga"
}
- 変数
- 下の場合は型推論され、xはintになる
- 明示的に値が初期化されなかった場合はゼロ値になる
- 型は値の後ろに書く
var x int = 1
x := 1
var y int // y = 0で初期化される
- 関数
- 戻り値の型は後ろ
- 引数は値渡し
- ポインタで参照渡しできる
- 複数の値を戻り値に出来る
- エラー処理は戻り値で(例外などない!)
func hoge(x int, y int) int {
// 略
}
- 配列とSlice
- 固定長が配列、可変がSlice
- Sliceは内部実装として配列のポインタを持つ
- GoのSliceもヤバイ - Qiita
var hoge [4]string // 配列
var fuga []string // slice
- Map
- 個人的にこの書き方はいまいちすっと入らない
- map[key]valueの順
var temp map[int]string = map[int]string{
1: "first",
2: "second",
}
temp[1] // first
_, ok := temp[2] // 対応する値があればokにtrueが入る
- ポインタ
- 伝統的な*でポインタ
- ポインタ演算はできません
- 構造体(struct)
- クラスとかそういうものはばっさり切り捨て
- ただし構造体型に対してメソッドを定義出来る
- インタフェース
- 例えばHogeという関数名でintを返すインタフェースがあったとき、構造体に対してHogeというメソッドを定義するとこのHogerインタフェースに適合したことになる
type Hoger interface {
Hoge() int //
}
- 構造体やインタフェースの拡張も出来る
- 型の埋め込みという
type Task struct {
ID int
*User // 埋め込み
}
type User struct {
Name string
}
// task.Nameのように、あたかもTaskがNameをもっているように書ける
- 並列処理
- Goroutineを使ってChannelを介したやりとりによって、並列処理を行う
- 「共有メモリを使って通信せず、通信によってメモリを共有せよ」
- Go の並行処理 - Block Rockin’ Codes
- Goroutine:複数のスレッド上で多重化されている処理の流れ
- go文で関数を実行すると起動
- channelを通してデータをやりとりする
- channelから読み出すデータがない場合はそこでロックされる
- channelを介した並列処理が推奨されるが、一般的なスレッドプログラミング(LockやMutexを使用した)もできる
- runtime.GOMAXPROCS()にコア数指定すると、マルチコアを使い切るようにできる
- CPUの(論理)コア数はruntime.NumCPU()で取得可能
func fuga1(c chan int) {
for i := 0; i < 10 ; i++ {
c <- i
}
}
func fuga2(c chan int) {
for x := range c {
print(x) // 0123456789
}
}
func hoge() {
ch := make(chan int)
go fuga1(ch)
go fuga2(ch)
}
- betterなC言語というイメージ
- Mapの書き方がなんかすっと入らない
- 検索しづらい
- エラー処理がif 〜で毎回書かなければいけないのは、イマイチ好きじゃない
- 並列処理の書きやすさはよい
- 標準でプログラムの整形をしてくれるツールやパッケージ管理もしてくれる
- コンパイラはもちろんドキュメント生成ツールまで一式
- プログラムのフォーマット(インデントがどれだけとか)が公式で決まっている、
パッケージ管理も決まっていたりと初めから整っている
- go get
- go fmt
- go test などなど
- VimやEmacs、IDEのプラグインもあったりする
- fatih/vim-go
- IntelliJのプラグインなど
- Goでのお作法に則っていれば、それほど環境整備に時間はかからない
- $GOPATH
- src
- pkg
- bin
- $GOPATHはどのディレクトリでもよい
- 他のツールと合わせてプロジェクトごとに$GOPATH設定して開発
- $GOROOT
- goがインストールされているところ
- 必ずしも設定が必要ではないが、ツールによっては必要
- Vim-goやIntelliJでも必要
- A Tour of Goをさらっとやってみる
- httpパッケージなどA tour of go 上で動かないサンプルもあるので、ローカルでやってみるのが良さそう
- Web+DB press Vol82
- The Go Programming Language
- (99+)golang-nuts - Google グループ
- Goに関する投稿 - Qiita