だいぶ日が経ってしまいましたが、4〜5月に開催されたGopher道場 #1に参加してきました。
参加した動機
先に私のGoレベルを書きます。
- Go言語歴 約1年半ぐらい。だけどたまにしか書かない
- 仕事ではほとんど使っていない。せいぜい簡単なコマンドラインツール程度
- 基本的な文法(for、if、スライス、マップなど)は理解している
- ゴルーチン、チャネルを使った平行処理が書けない(読むのもためらう)
- Contextについて理解していない
このように初心者レベルですが、Go言語のやシンプルさに惹かれてちゃんと使えるようになりたいと思っていました。会社内で勉強会をひらいたりして布教に努めましたが、教えるレベルの人がいないので書籍を一通り読むぐらいで終わってしまいました。
初心者を脱してちゃんと使えるレベルになろうと思っていたところにGopher道場を知りました。
メルペイさんはプロダクトにGo言語を採用されていて以前から興味がありました。講師の @tenntenn さんはGo言語に関する記事を多数書かれておりプロならではの話が聞ける良い機会だと思い入門することにしました。
事前課題
誰でも入門できるわけではありません。入門するためにはいくつかの条件がありました。
- 開催日にすべて参加できること
- 事前課題を提出すること
1に関しては、予定を空けることができました(後述しますが実は2回目は急遽参加できませんでした)。
2に関しては、具体的な課題内容は伏せますがコマンドラインツールを実装するというもので、一通りの文法を知っていれば私でも書けるものでした。 提出された課題はすべて @tenntenn さんがチェックして通過できた人だけが道場に参加できます。
1回目
一回目はGo言語の基礎からです。スライドの資料を使って講義が行われました。スライド中のコードにGo Playgroundのリンクを貼ってくれているので手元で実行できて理解が深めることができました。
Goとはなにか、開発された理由、特徴から始まって文法の基礎について説明されました。課題をクリアしている人たちなので文法については時折スキップされることもありました。
以下、私が個人的に気になった箇所のメモです。意味がわからなくても気にしないでください。
Init()
は何回書いてもOK- ファイルが分かれていてもそれぞれに
init()
を書いてもよい。そのおかげで初期化するためだけのファイル(init.go とか)を作らなくても済む
- ファイルが分かれていてもそれぞれに
- Goは型を後ろに書く
- const は型の制限がない
- constに限っては書きやすさを優先
- e.g.
10 * time.Second
time.Duration
は int64のキャスト
- スライス、マップはポインタとなるので、代入だと同じところ(アドレス)に見にいく
- スライスを別領域に確保したい場合はcopyを使う
- https://play.golang.org/p/ry3xJq45n1w
- マップはcopy使えないので、forで一つずつコピーする
- スライスの初期化はnil許容
var n []int
- マップの初期化はだいたいmakeをつかう
m = make(map[string]int)
- 空にする
m := map[string]int{}
- 型エイリアス
- 主に互換性を保ったリファクタリングに使う
- パッケージ名の移行など
- 大規模なコードで使うかもしれない
- 例) contextパッケージ
- 元々
golang.org/x/net/context
だったが、1.7でメインパッケージに入った type Context = context.Context
- メソッドは構造体以外にも定義できる
type Hex int
とか
- レシーバにできる型
- 参照型
- マップやスライスもレシーバにできる
宿題
毎回の講義の後に宿題が課されます。内容は画像変換コマンドを実装するというものでした。 内容を理解できて少しググればそんなに難しくありませんでした。
2回目
当日の朝ギックリ腰になってしまい移動不可になっため、参加できませんでした。。。 内容としては、パッケージのバージョン管理やInterface、エラー処理、テストがメインでした。めっちゃ行きたかった・・・!!
宿題
1回目で実装したコマンドのテストを書くといったものでした。参加できなかったので講義資料を何度も見ながらググって提出しました。
この回から宿題はGitHubのPRでの提出になりました。他の人もソースコードも見れて参考になります(ただし自分の力で宿題をやってから見ましょう!!)
https://github.com/gopherdojo/dojo1
3回目
並行処理がメインです。ゴルーチン、チャネル、syncパッケージ、Contextを解説いただきました。個人的に最も知りたかった内容です。ただ、情報量が多いのと私の理解がおぼつかなくて苦戦しました。4回目までの間にGWがあったので理解に時間を費やせて助かりました。
以下、講義メモです。
- Golangは
並行
が得意 - ゴルーチン書く場合は、どこかで合流する処理が必要。sleepとかチャネルとか
- チャネルはスレッドセーフ
- チャネルに値を入れる場合は、受け取ってくれるまで待つ
- チャネルから値を取り出す場合は、入れてくれるまで待つ
- makeは初期化が必要なものに使う
struct{}
はメモリ食わない
done := make(chan struct{})
done <- struct{}{}
- select文
- defaultはselect文実行時に何もチャネルに値が入っていない場合にいく
- nilチャネルは何もしない
- ゴールーチンはmain関数が終わるまでずっと処理している
- サーバーとかずっと稼働している場合は、メモリリークが発生する場合がある
- select文で選ばれなかったやつは本当に終わっているのかを確認する
- メモリリークは自分で気づくしかない
- ゴールーチンのランタイム数を監視した方がいい
- NumGoroutine()
- gotrace
- ゴールーチンの可視化
select {}
は mainゴールーチンをずっと止めておける<-chain
受信チャネルから受け取るイメージchain<-
送信チャネルから送りつけているイメージ- チャネルのクローズは送る側がする
- クローズは送りきったことを明示的にする
- チャネルにrange使える
- closeしたタイミングで抜ける
sync.WaitGroup
- Add した後に Doneを呼ばないとWaitで待ち続ける
- ライブラリ作るときにゴールーチンを使わないほうがいい
sync.Once
内でパニックが起こって値が入らないと永遠に値が入らないままになるhttp.Request
だと特に怖い- https://play.golang.org/p/zm2MSw1LMPY
- ゴールーチン内で起きたパニックはゴールーチン外ではリカバリーできない
- 同じゴールーチン内でリカバリする(する場合)
- Google App Engineは並列度1
- Contextで親子関係ができる
- errGroup で Context が使われている
宿題
2つ出されました。1つ目はタイピングゲームをつくる、2つ目は分割ダウンロードを行うです。
言い訳ですが、理解が追いつかなくてGW中は子育てと総復習に時間を充てたため、2つ目の宿題ができておりませんでした。。。
4回目
いよいよ最終回です。 net/http
パッケージがメインでした。
短いですが、メモです。
- httpハンドラ
- 1リクエストあたりの処理は並行で動く
- ゴルーチンで動く。パニックになると救出しないといけない
HandlerFunc("/", handler)
- "/" はパターン
- 順序が変わるとバグを生む原因になる
json.RawMessage
・・・ バイトコードのままにしてくれる
宿題はおみくじAPIを実装するでした。
講義終了後
卒業の証ということでシールをいただきました。このGopher道場のためだけに作ってくれたそうです。他の勉強会では配布していないのでかなりレアです。
講義終了後は、メルカリさんのオフィスツアーです。社員数が急激に増加し手狭になってきたそうですが、最近メルペイさんが別の階に引っ越しされたらしく広々とゆったりとしたオフィスでした。六本木ヒルズということもありますがどれを切り取ってもオシャレで羨ましいです。
ツアー後は、メルペイCTOからメルペイのミッション、Gopher道場の開催目的をプレゼンがあり、最後は懇親会です。
メルペイのエンジニアも参加していただき色んな話を聞くことができました。懇親会中にLTもあり、とても興味深くて面白い内容でした。
参加してみて
ざっくりとした参加レポートになってしまいましたが、Gopher道場があった1ヶ月の間はGo言語について真剣に向き合えることができた時間だったと思います。自分ひとりではサボってしまいますが、参加者皆さんがやる気に満ちていているのを感じて自分だけがサボるわけにはいかないと奮起することができました。お金払ってでも受けてみたいレベルのプロの講義を聞けて、やる気に満ち溢れた参加者に囲まれの至り尽くせリのこの勉強会が無料で参加できたことが奇跡に思います。
Gopher道場に参加したことで得られたもの
並列処理に少しだけ強くなった(ソースコードを読むのは遅いけど尻込みしなくなった)
Gopher道場というコミュニティ。多少の差はあれど自分とGoレベルが同じぐらいの人との繋がり
Gopher道場卒業シール
興味が出てきたら
Gopher道場の第二回目が案内されていますので、Go言語について学びたい人は参加してみてはいかがでしょうか。
その前にGopher道場 #1 LT大会 がありますので、そちらに参加されると空気感がわかるかと思います(私もLTします)。メルペイも回し者ではありませんが、それぐらい参加する価値がある勉強会でした。
最後に
Gopher道場の卒業はゴールではなく、Gopherにとってスタートだと思います。これからより一層Go言語を好きになって開発していきたい所存です。