memo
Go も変数とかの名前は基本長めにしたほうがいい
短めにすればいいというわけではない
iota
連番が作れる
使うなら気をつけて
ゴルーチンが切り替わるタイミング
処理が止まった時に次の処理に切り替わる
並列度
runtime.GOMAXPROCS で設定できる
runtime.NumCPU で論理 CPU の値が取得できる default 値
並列度を 1 にして問題の切り分けを行ったりする
効果的でない部分や、ライブラリでは goroutin を使わない
チャネルの close
基本的にはあまりクローズしない
close は送信側が行う
同じチャネルは 2 度閉じれない、閉じられたチャネルには送信できない
panic が起こる
close を使ったブロードキャスト
複数のチャネルに伝える
コンテキスト
appengine で定義された
準標準パッケージと悪魔合体
Go 1.9 から色々解決
コンテキストとキャンセル処理
context.Done() (<- chan {}struct}
context は親で閉じる
複数タイムアウトしたい場合は context を増やす
コンテキストに値を持たせる
WithValue で値を持たせる
e.g. キャッシュを充てない
memcache の接続の手前で仕込んでキャッシュしないなどができる
値を持たせる場合は getter も作りましょう
コンテキストの注意点
構造体のフィールドなどに保存しない
引数で引き回しましょう
リクエスト起因のデータを保存する
http サーバ作成の流れ
ハンドラの作成
ハンドラとエントリポイントの結びつけ
http サーバの起動
json
encoding/json
構造体のタグでフィールド名を指定する
ミドルウェアを作る
ハンドラより前に行う共通処理を定義できる
テンプレートエンジンの利用
. がトップレベル
http ハンドラのテスト
net/http/httptest
httpクライアント
DefaultClient (Get Post はラッパー
Client.Do で自分でリクエストを定義できる
リクエストとコンテキスト
http.Client, http.Transport
Client が http の通信をやっているが、中で Transport が通信を担当している
http.DefaultTransport
http.Client の Transport フィールドが nil の時に使われる
http.RondTripper
http のトランザクションを行うインタフェース
http.Client を差し替えできるようにしておいてほしい
appEngine とかは DefaultClient を使わないため
Default~ っという関数名は差し替えられるように作ると良い