package
1.23.0
Repository: https://github.com/shogo82148/std.git
Documentation: pkg.go.dev

# Packages

atomicパッケージは、同期アルゴリズムの実装に役立つ 低レベルのアトミックメモリプリミティブを提供します。 これらの関数は、正しく使用するためには非常に注意が必要です。 特別な低レベルのアプリケーションを除き、同期はチャネルや[sync]パッケージの機能を 使用して行う方が良いです。 メモリを共有するために通信を行い、 メモリを共有するために通信を行わないでください。 SwapT関数によって実装されるスワップ操作は、アトミックの 相当するものです: old = *addr *addr = new return old CompareAndSwapT関数によって実装される比較交換操作は、アトミックの 相当するものです: if *addr == old { *addr = new return true } return false AddT関数によって実装される加算操作は、アトミックの 相当するものです: *addr += delta return *addr LoadTおよびStoreT関数によって実装されるロードおよびストア操作は、 "return *addr"および"*addr = val"のアトミック相当です。 [the Go memory model] の用語では、アトミック操作Aの効果が アトミック操作Bによって観察される場合、AはBの前に「同期する」。 さらに、プログラムで実行されるすべてのアトミック操作は、 あたかも一貫した順序で実行されるかのように振る舞います。 この定義は、C++の一貫性のあるアトミックとJavaのvolatile変数と 同じセマンティクスを提供します。 [the Go memory model]: https://go.dev/ref/mem.

# Functions

NewCondはLocker lを持つ新しいCondを返します。.
OnceFuncは関数fを一度だけ呼び出す関数を返します。返された関数は並行して呼び出すことができます。 fがパニックを起こした場合、返された関数はすべての呼び出しで同じ値でパニックを起こします。.
OnceValue は、関数 f を一度だけ呼び出し、f の戻り値を返す関数を返します。 返された関数は、同時に呼び出すことができます。 f がパニックを起こした場合、返された関数はすべての呼び出しで同じ値を持つパニックを発生させます。.
OnceValuesは、fを一度だけ呼び出し、fによって返された値を返す関数を返します。返された関数は並行して呼び出すことができます。 fがパニックを引き起こした場合、返された関数はすべての呼び出しで同じ値でパニックを起こします。.

# Structs

Condはイベントの発生を待つまたは宣言するための待機ポイントである条件変数を実装します。 各Condには関連付けられたLocker L(通常は [*Mutex] または [*RWMutex])があり、条件を変更するときや [Cond.Wait] メソッドを呼び出すときに保持する必要があります。 最初の使用後にCondをコピーしてはいけません。 [the Go memory model] の用語では、Condは [Cond.Broadcast] または [Cond.Signal] の呼び出しが、それによってブロック解除される任意のWait呼び出しよりも 「先に同期する」ように配置します。 単純な使用例では、ユーザーはチャネルを使用する方がCondよりも優れています(Broadcastはチャネルを閉じることに対応し、Signalはチャネルに送信することに対応します)。 [sync.Cond] の代わりに他のものについては、[Roberto Clapis's series on advanced concurrency patterns] と [Bryan Mills's talk on concurrency patterns] を参照してください。 [the Go memory model]: https://go.dev/ref/mem [Roberto Clapis's series on advanced concurrency patterns]: https://blogtitle.github.io/categories/concurrency/ [Bryan Mills's talk on concurrency patterns]: https://drive.google.com/file/d/1nPdvhB0PutEJzdCq5ms6UI58dp50fcAN/view.
MapはGoのmap[any]anyと似ていますが、追加のロックや調整なしで 複数のゴルーチンから同時に使用しても安全です。 ロード、ストア、削除は平均定数時間で実行されます。 Map型は特殊化されています。ほとんどのコードでは代わりに単純なGoのmapを使用すべきであり、 型の安全性を向上させ、他の不変条件とマップのコンテンツを維持しやすくするために別個のロックや調整を行うべきです。 Map型は2つの一般的な使用例に最適化されています:(1)特定のキーのエントリが一度しか書き込まれずに多くの回数読み取られる場合、 つまり成長のみのキャッシュ、または(2)複数のゴルーチンが交差しないキーのセットの読み取り、書き込み、上書きを行う場合。 これらの2つの場合において、Mapの使用は、別個の [Mutex] や [RWMutex] とペアになったGoのマップと比較して、 ロックの競合を大幅に減らすことができます。 ゼロ値のMapは空で使用準備ができています。Mapは最初の使用後にコピーされてはなりません。 [the Go memory model] の用語では、Mapは書き込み操作が行われたときにそれに続く読み取り操作を "書き込みより前に同期します"。 ここで、読み取りと書き込み操作は以下のように定義されます。 [Map.Load]、[Map.LoadAndDelete]、[Map.LoadOrStore]、[Map.Swap]、[Map.CompareAndSwap]、[Map.CompareAndDelete] は読み取り操作です。 [Map.Delete]、[Map.LoadAndDelete]、[Map.Store]、[Map.Swap] は書き込み操作です。 [Map.LoadOrStore] は、loadedがfalseで返された場合に書き込み操作です。 [Map.CompareAndSwap] は、swappedがtrueで返された場合に書き込み操作です。 [Map.CompareAndDelete] は、deletedがtrueで返された場合に書き込み操作です。 [the Go memory model]: https://go.dev/ref/mem.
Mutexは相互排他ロックです。 Mutexのゼロ値はロックされていないMutexです。 Mutexは最初の使用後にコピーしてはいけません。 [the Go memory model] の用語では、[Mutex.Unlock] のn回目の呼び出しはm回目の [Mutex.Lock] の前に同期されます(n < m)。 [Mutex.TryLock] の成功した呼び出しはLockの呼び出しと同等です。 TryLockの失敗した呼び出しはどのような「同期前の」関係も確立しません。 [the Go memory model]: https://go.dev/ref/mem.
Onceは正確に1つのアクションを実行するオブジェクトです。 Onceは最初の使用後にコピーしてはいけません。 [the Go memory model] の用語では、fからの戻り値はonce.Do(f)の呼び出しの戻り値よりも前に同期します。 [the Go memory model]: https://go.dev/ref/mem.
プールとは個別に保存および取り出しが可能な一時オブジェクトのセットです。 プールに保存されたアイテムは、通知なしにいつでも自動的に削除される可能性があります。 これが発生する際にプールが唯一の参照を保持している場合、そのアイテムは解放される可能性があります。 プールは、複数のゴルーチンによる同時の使用に対して安全です。 プールの目的は、割り当てされたが未使用のアイテムをキャッシュして後で再利用することで、 ガベージコレクタにかかる負荷を軽減することです。つまり、効率的かつスレッドセーフな無料リストを構築することを簡単にします。 ただし、プールはすべての無料リストに適しているわけではありません。 プールの適切な使用例は、パッケージの独立した並行クライアント間で静に共有され、 潜在的に再利用される一時アイテムのグループを管理することです。 プールは、多くのクライアント間で割り当てのオーバーヘッドを分散する方法を提供します。 プールの良い使用例は、fmtパッケージにあります。これは一時的な出力バッファのサイズを動的に管理しています。 このストアは、負荷がかかった場合(多くのゴルーチンがアクティブに印刷している場合)に拡大し、静かな場合には縮小します。 一方、短命なオブジェクトの一部として維持される無料リストは、プールには適していません。 なぜなら、このシナリオではオーバーヘッドを適切に分散させることができないからです。 このようなオブジェクトは、独自の無料リストを実装する方が効率的です。 プールは、最初の使用後にコピーしないでください。 [the Go memory model] の用語では、Put(x)の呼び出しは、 同じ値xを返す [Pool.Get] の呼び出しよりも「先に同期します」。 同様に、Newがxを返す呼び出しは、 同じ値xを返すGetの呼び出しよりも「先に同期します」。 [the Go memory model]: https://go.dev/ref/mem.
RWMutexは、読み込み/書き込み相互排他的なロックです。 ロックは任意の数の読み込み者または単一の書き込み者によって保持することができます。 RWMutexのゼロ値はロックされていないミューテックスです。 RWMutexは、最初の使用後にコピーしてはいけません。 もし任意のゴルーチンが [RWMutex.Lock] を呼び出し、そのロックがすでに 1つ以上のリーダーによって保持されている場合、並行する [RWMutex.RLock] への呼び出しは ライターがロックを取得(そして解放)するまでブロックされます。これにより、 ロックが最終的にライターに利用可能になることを保証します。 これは再帰的な読み取りロックを禁止することに注意してください。 [the Go memory model] の用語では、 n番目の [RWMutex.Unlock] への呼び出しは、任意のn < mに対するm番目のLockへの呼び出しよりも 「先に同期します」。これは [Mutex] と同様です。 RLockへの任意の呼び出しに対して、nが存在し、 n番目のUnlockへの呼び出しはそのRLockへの呼び出しよりも「先に同期します」、 そして対応する [RWMutex.RUnlock] への呼び出しも同様に「先に同期します」。 [the Go memory model]: https://go.dev/ref/mem.
WaitGroupは、一連のゴルーチンの完了を待機します。 メインゴルーチンは、待機するゴルーチンの数を設定するために [WaitGroup.Add] を呼び出します。 それぞれのゴルーチンは実行され、終了時に [WaitGroup.Done] を呼び出します。 同時に、全てのゴルーチンが終了するまでブロックするために [WaitGroup.Wait] を使用できます。 WaitGroupは、初回使用後にコピーしてはいけません。 [the Go memory model] の用語である、[WaitGroup.Done] への呼び出しは、それによってブロックが解除される任意のWait呼び出しの前に「同期します」。 [the Go memory model]: https://go.dev/ref/mem.

# Interfaces

Lockerはロックおよびアンロックできるオブジェクトを表します。.