16
Goを知る Let it Go

Goを知る

Embed Size (px)

Citation preview

Page 1: Goを知る

Goを知る

Let it Go

Page 2: Goを知る
Page 3: Goを知る

GoってGoogle App Engineでしか動かないんだよね?

Page 4: Goを知る

Google App Engine専用の言語じゃないぞ

Page 5: Goを知る

Goってマイナーだから使う人にランタイムいれてもらうの大変では。。。?

Page 6: Goを知る

Goは実行可能バイナリを作る

$ go build main.go$ ./mainHello Go world!$

Page 7: Goを知る

Goに対する誤った認識を取り除いたとこで。。

Page 8: Goを知る

Goの「ヤバい」と思うポイントを紹介してみます(※)

※ fkm個人の感想です

Page 9: Goを知る

問題なければスタックを使う

Moke型のオブジェクトを生成し返す関数

func NewMoke() Moke { // Mokeを生成しreturn}

Page 10: Goを知る

問題なければスタックを使う

一見、ヒープにオブジェクトを生成してから

返しているように見えるが。。。

func NewMoke() Moke { o := &Moke{} return *o}

Page 11: Goを知る

問題なければスタックを使う

ポインタとして使ってないので、

関数内で生成するオブジェクトは

スタックに置かれる

→GC不要なオブジェクトに!

$ go build --gcflags -m main.go中略

./main.go:16: NewMoke &Moke literal does not escape

Page 12: Goを知る

Goroutine

非同期処理簡単

func moke() { go func() { // 非同期でやりたい処理

}()}

Page 13: Goを知る

Goroutineはスレッドじゃない

● スレッド○ タイマーで切り替わる○ 切り換え時にレジスタの内容などを退避

■ レジスタの本数って。。。● Goroutine

○ スケジュールで切り替わる○ 退避する内容がかなり少ない

■ PC/スタックポインタ/DXの3つ

Page 14: Goを知る

レジスタが空くタイミングは分かる

Goソース

func main() { // 処理1 // 処理2 // 処理3}

アセンブリ

// 処理1-1// 処理1-2// 処理2-1// 処理2-2(この時点でレジスタは空くぞ。。。!)

// 処理3-1...

Page 15: Goを知る

コンパイル周りが割とガチなのです