Upload
hirokazu-fukami
View
505
Download
2
Embed Size (px)
Citation preview
Goを知る
Let it Go
GoってGoogle App Engineでしか動かないんだよね?
Google App Engine専用の言語じゃないぞ
Goってマイナーだから使う人にランタイムいれてもらうの大変では。。。?
Goは実行可能バイナリを作る
$ go build main.go$ ./mainHello Go world!$
Goに対する誤った認識を取り除いたとこで。。
Goの「ヤバい」と思うポイントを紹介してみます(※)
※ fkm個人の感想です
問題なければスタックを使う
Moke型のオブジェクトを生成し返す関数
func NewMoke() Moke { // Mokeを生成しreturn}
問題なければスタックを使う
一見、ヒープにオブジェクトを生成してから
返しているように見えるが。。。
func NewMoke() Moke { o := &Moke{} return *o}
問題なければスタックを使う
ポインタとして使ってないので、
関数内で生成するオブジェクトは
スタックに置かれる
→GC不要なオブジェクトに!
$ go build --gcflags -m main.go中略
./main.go:16: NewMoke &Moke literal does not escape
Goroutine
非同期処理簡単
func moke() { go func() { // 非同期でやりたい処理
}()}
Goroutineはスレッドじゃない
● スレッド○ タイマーで切り替わる○ 切り換え時にレジスタの内容などを退避
■ レジスタの本数って。。。● Goroutine
○ スケジュールで切り替わる○ 退避する内容がかなり少ない
■ PC/スタックポインタ/DXの3つ
レジスタが空くタイミングは分かる
Goソース
func main() { // 処理1 // 処理2 // 処理3}
アセンブリ
// 処理1-1// 処理1-2// 処理2-1// 処理2-2(この時点でレジスタは空くぞ。。。!)
// 処理3-1...
コンパイル周りが割とガチなのです
参考資料
http://najeira.blogspot.jp/2013/10/go.htmlhttp://blog.nindalf.com/how-goroutines-work/Gopherイラスト
https://github.com/tenntenn/gopher-stickers