sync.Onceとsync.Map
一度だけ行う初期化と並行マップ
「sync.Onceとsync.Map」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
sync.Once
sync.Onceは、複数のゴルーチンから同時に呼び出された場合でも、関数が必ず一度だけ実行されることを保証します。典型的な用途は、シングルトンの遅延初期化です。
Once.Do
Doへの最初の呼び出しだけが関数を実行します。それ以降の呼び出しは、別のゴルーチンから呼び出された場合でも何もしません。
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Onceはリセットされません
sync.Onceが一度実行されると、リセットすることはできません。リセット可能な一度限りの実行が必要な場合は、atomicまたはmutexを使って状態を手動で管理します。
Onceでのパニックの動作
Doに渡した関数がパニックすると、Doは完了したものとみなされ、それ以降の呼び出しは何もしません。パニックは最初の呼び出し元に伝播します。
sync.Mapの概要
sync.Mapは、外部ロックなしで使用できる並行マップです。次の2つのパターンに最適化されています。(1) 一度だけ書き込み、多数回読み取る場合、(2) ゴルーチンごとにキーの集合が重ならない場合。
sync.Mapのメソッド
主なメソッドはStore、Load、LoadOrStore、Delete、Rangeです。ジェネリック型パラメーターはなく、キーと値はinterface{}です。
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStoreは、キーが存在する場合は既存の値を返し、存在しない場合は新しい値を保存して返します。ブール値は、値が読み込まれた場合はtrue、保存された場合はfalseを示します。
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Rangeは、各キーと値のペアに対して関数を呼び出しながら、すべてのペアを反復処理します。falseを返すと反復を停止します。
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})sync.Mapを使用するタイミング
ほとんどの場合は、Mutexを使った通常のmapを優先します。こちらのほうが単純で、多くの場合に高速です。競合が発生していることがプロファイリングで判明した場合や、アクセスパターンが最適化対象に一致する場合にsync.Mapを使用します。
LoadAndDelete
LoadAndDeleteは値の読み取りとキーの削除をアトミックに行い、以前の値と、そのキーが存在したかどうかを返します。
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Mapはジェネリックではありません
sync.Mapに保存される値はanyです。コードベース内に型アサーションが散在するのを避けるには、型安全なメソッドを持つ型付き構造体でsync.Mapをラップします。
確認問題
sync.Onceは何を保証しますか。
まとめ: sync.Onceとsync.Map
要点:
- sync.Once: 関数を必ず一度だけ実行します。リセットできません
- sync.Map: 読み取りが多いパターンや、キーが重ならないパターンに最適化された並行マップです
- 安全性を高めるため、sync.Mapの周囲に型付きラッパーを使用します
よくある質問
「sync.Onceとsync.Map」レッスンは無料ですか?
はい。「sync.Onceとsync.Map」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「sync.Onceとsync.Map」で何を学びますか?
一度だけ行う初期化と並行マップ ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「sync.Onceとsync.Map」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- sync.Mutexとsync.RWMutex
- sync.WaitGroup
- sync.Onceとsync.Map
- 競合検出器と安全なパターン