ゴーゲンゴむずかしす
context.Context
ドキュメント https://golang.org/pkg/context/
内部ソース https://golang.org/src/context/context.go
使用例? https://blog.golang.org/context
ドキュメント眺めてもよく分からんかったが
使用例(?)を見たら雰囲気は感じた、理解には至ってないが
内部ソース見たら面白いと感じた(退屈がまぎれた、という意味程度
使用例を見た感じ
別スレッドに投げた処理を中断させたいときに使う感じ?
WithValueは分からない
英語力がないためドキュメントの英語を解釈できない…
オプション引数ではなく、リクエストスコープのデータで渡せって、まぁたぶんリクエストスコープという用語の意味を俺が理解してないため分からんのだと思う
WithValueでの値の持たせかたはリスト構造…?
context.Background()とcontext.TODO()はアドレス値が違うだけで実装は同じなのな…(ソースコードを読む人間にとっての目的の解釈の違いだけ、みたいな?
ソースにあったemptyCtxの説明のとこでintとstruct{}での違いみたいな話、初めて知った
backgroundとtodoの違いはアドレス値の違いからString()メソッドの出力文字列が違うのだけど、その判定方法がswitch文でアドレス値比較とかしてるぽくて、変数(のアドレス?)をcaseに置けるとは知らんかった…(caseに式を置けるのだから、まぁ変数もそりゃ置けるわな… https://golang.org/ref/spec#ExprSwitchStmt
contextの内部ソース見て、インターフェースの実装されてないじゃん、てなって、何で?とテキトー調べて、Embeddingのこと初めて知った(今まで部分的、局所的にしか理解してなかった
https://golang.org/doc/effective_go.html#embedding
今までインターフェースの合成に使うもんだという理解してたけど、それだけじゃないんだな…
structの名前なしフィールド(埋め込み?)のやつのメソッドがガワに提供されるのな…
embeddingの埋め込みって言葉なんだから、まぁそれはそうなのかもだが…
net/http.ServerのShutdown()メソッド
ドキュメント https://golang.org/pkg/net/http/#Server.Shutdown
サンプルコード https://golang.org/pkg/net/http/#example_Server_Shutdown
内部ソース https://golang.org/src/net/http/server.go?s=85122:85176#L2687
もともとこれの引数のcontext.Background()のContextがイミフだったのでcontext調べてたんだけど、それは前述のとおりの雑な解釈理解したのでOK
context理解したところでこのShutdownでcontext渡すの何?と思って
こちらも内部ソース見たが
Shutdownの処理は
まずListenの内部のループ脱出のためのチャネル・クローズを行って
RegisterOnShutdownで登録された終了前に呼んで欲しい関数どもをスレッド並列で一気に呼び出したのち
生きてる接続が全部安全終了できるまで待つための無限ループに入って
その無限ループ内でループ脱出するひとつの方法としてcontextのDone()チャネル受信(つまりcontextからの中断要求?)がなされてる
contextが呼び出されると生きてる接続を安全終了させずにループ抜けちゃうので、よほどの事情のタイムアウト強制終了で使うということぽい…
RegisterOnShutdownがいくつも登録できるのがソース読んで理解したが
登録した関数が終了することは保証されないぽい(それぞれ別スレッドに投げられちゃうわけで…実行中のそれらのスレッドの終了を待つ処理を入れないとプログラム自体が先に終了することもありうる…登録前にそれらの関数内にWaitGroup登録しとくとかの対策はいるのかも(まぁ絶対確実に実行して欲しいとかでなければそこまでやらんでもってかもだが…