gin.Contextをgoroutineに渡す時に気をつけること
ginのContextをgoroutineに渡す時は、Context.Copy()を使うこと。
... ctx := c.Copy() go func() { // ctx を使った処理など } ...
gin.Contextのインスタンスはsync.Poolで使い回されており、使う度にフィールドを初期化するためにリセットしている。そのため、goroutineにContextを渡すと、処理中に別のgoroutineから容赦なくフィールドが初期化されてしまう。
詳細はここの記事が詳しい。
あと、Context.Copy()
は、元々のContextが持っていたKey/Values (map) も複製してくれるが、mapより先の複製は担保していないので注意。そもそもそんな使い方するなっていう話ではあるけど。