GoのnoCopyが構造体コピーを検出する仕組み
How Go detects struct copies with sync.noCopy

sync.Mutex、sync.Once、sync.Mapなどの構造体に含まれるnoCopyフィールドは、コンパイラに特別な意味を持たないが、go vetのcopylocksチェッカーがコピーを警告するためのマーカーとして機能する。noCopyがLock/Unlockメソッドを持つ理由、sync.MapがnoCopyを必要とする理由、そして自分でnoCopyを定義する方法を解説。さらに、コピーを無視した場合の具体的な問題(WaitGroupが終了しないなど)や、フィールド位置による構造体サイズへの影響も紹介する。
noCopyマーカーはGoコンパイラに特別なルールを追加するものではありません。
HNでの議論
10- woadwarrior01
> noCopyは、最初の使用後にコピーしてはならない型のための特別なマーカーです。
ハックのように見え、ハックのように歩き、ハックのように鳴くなら...
- meerita
Aliaksandr Valialkin(noCopyの作者)と話したことがあり、彼は自分の理由を教えてくれた:
- https://x.com/valyala/status/2088638160242683954
また、今なら何を変えるかという答えもくれた: https://itnext.io/go-evolves-in-the-wrong-direction-7dfda8a1...
彼はGoの新しい方向性に満足していないようだ。なぜなら、他の言語から機能を取り入れているからだ。
- CamouflagedKiwi
これは理想的にはstructsパッケージの公開機能であるべきで、誰でも利用できるようにすべきだ。syncパッケージ専用の特別に認可された内部機能ではなく。
- fithisux
とても良い記事だ。`go vet`と調和して動作する興味深いアプローチだ。