日々、雑雑と。

いろいろなことを垂れ流し

gin.Contextをgoroutineに渡す時に気をつけること

ginのContextをgoroutineに渡す時は、Context.Copy()を使うこと。

...
ctx := c.Copy()
go func() {
    // ctx を使った処理など
}
...

gin.Contextのインスタンスはsync.Poolで使い回されており、使う度にフィールドを初期化するためにリセットしている。そのため、goroutineにContextを渡すと、処理中に別のgoroutineから容赦なくフィールドが初期化されてしまう。

詳細はここの記事が詳しい。

zenn.dev


あと、Context.Copy()は、元々のContextが持っていたKey/Values (map) も複製してくれるが、mapより先の複製は担保していないので注意。そもそもそんな使い方するなっていう話ではあるけど。