GoのnoCopyが構造体コピーを検出する仕組み

How Go detects struct copies with sync.noCopy

GoのnoCopyが構造体コピーを検出する仕組み

sync.Mutex、sync.Once、sync.Mapなどの構造体に含まれるnoCopyフィールドは、コンパイラに特別な意味を持たないが、go vetのcopylocksチェッカーがコピーを警告するためのマーカーとして機能する。noCopyがLock/Unlockメソッドを持つ理由、sync.MapがnoCopyを必要とする理由、そして自分でnoCopyを定義する方法を解説。さらに、コピーを無視した場合の具体的な問題(WaitGroupが終了しないなど)や、フィールド位置による構造体サイズへの影響も紹介する。

noCopyマーカーはGoコンパイラに特別なルールを追加するものではありません。
  1. woadwarrior01

    > noCopyは、最初の使用後にコピーしてはならない型のための特別なマーカーです。

    ハックのように見え、ハックのように歩き、ハックのように鳴くなら...

  2. meerita

    Aliaksandr Valialkin(noCopyの作者)と話したことがあり、彼は自分の理由を教えてくれた:

    - https://x.com/valyala/status/2088638160242683954

    また、今なら何を変えるかという答えもくれた: https://itnext.io/go-evolves-in-the-wrong-direction-7dfda8a1...

    彼はGoの新しい方向性に満足していないようだ。なぜなら、他の言語から機能を取り入れているからだ。

  3. CamouflagedKiwi

    これは理想的にはstructsパッケージの公開機能であるべきで、誰でも利用できるようにすべきだ。syncパッケージ専用の特別に認可された内部機能ではなく。

  4. fithisux

    とても良い記事だ。`go vet`と調和して動作する興味深いアプローチだ。

この日のほかの記事

2026-08-17