0Pricing
Go Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. sync.Mutexとsync.RWMutex
  2. sync.WaitGroup
  3. sync.Onceとsync.Map
  4. 競合検出器と安全なパターン
← Go Academyに戻る