Go 言語のドキュメント分析: sync.Once 関数は単一実行を実装します

王林
リリース: 2023-11-03 08:28:50
オリジナル
2113 人が閲覧しました

Go 言語のドキュメント分析: sync.Once 関数は単一実行を実装します

Go 言語のドキュメント分析: sync.Once 関数は単一実行を実装し、特定のコード例が必要です

Go 言語の sync パッケージは、同期操作のためのいくつかの関数を提供します 関数と型。非常に便利な関数の 1 つは sync.Once で、操作が 1 回だけ実行されるようにします。この記事では、sync.Once 関数の使用法を詳細に分析し、いくつかの具体的なコード例を示します。

sync.Once 関数は次のように定義されています:

type Once struct {
    m    Mutex
    done uint32
}

func (o *Once) Do(f func()) {
    if atomic.LoadUint32(&o.done) == 1 {
        return
    }
    o.m.Lock()
    defer o.m.Unlock()
    if o.done == 0 {
        f()
        atomic.StoreUint32(&o.done, 1)
    }
}
ログイン後にコピー

ご覧のとおり、sync.Once 構造にはミューテックス (Mutex) と操作がすでに実行されたかどうかを記録する Done フラグが含まれています。 。 Once 構造の Do メソッドは、単一実行を実現するためのコア ロジックです。

Do メソッドは、まずアトミック操作 atomic.LoadUint32 を通じて、完了フラグが 1 であるかどうかを確認します。 1 の場合は、操作が実行されたことを意味し、そのまま戻ります。それ以外の場合は、ミューテックスを取得し、完了フラグが 0 であるかどうかを再度確認します。 0 の場合は、渡された関数 f を実行し、アトミック操作 atomic.StoreUint32 を通じて Done フラグを 1 に設定して、次回呼び出されるときに f が実行されないようにします。

以下は、sync.Once 関数を使用して 1 回の実行を実現する方法を示す簡単な例です:

package main

import (
    "fmt"
    "sync"
)

var once sync.Once

func main() {
    for i := 0; i < 5; i++ {
        // 只有第一次调用会执行
        once.Do(func() {
            fmt.Println("This will only print once.")
        })
    }
}
ログイン後にコピー

上記のコードを実行すると、出力は次のようになります:

This will only print once.
ログイン後にコピー

once.Do メソッドがループ内で複数回呼び出されているにもかかわらず、渡された関数が実際に実行されるのは最初の呼び出しだけであり、後続の呼び出しは再度実行されずに直接返されることがわかります。

sync.Once 関数には、幅広い使用シナリオがあります。たとえば、グローバル変数を初期化する場合、変数にアクセスするたびに初期化を行うのではなく、通常は 1 回だけ初期化を実行したいと考えます。この時点で、sync.Once 関数を使用して、初期化が 1 回だけ実行されるようにすることができます。

var (
    data  []string
    once  sync.Once
)

func loadData() {
    // 模拟耗时的数据加载操作
    // 这里简单起见直接赋值
    data = []string{"Hello", "World"}
}

func getData() []string {
    once.Do(loadData)
    return data
}

func main() {
    fmt.Println(getData())
    fmt.Println(getData())
}
ログイン後にコピー

上記のコードを実行すると、出力結果は次のようになります:

[Hello World]
[Hello World]
ログイン後にコピー

sync.Once 関数とloadData 関数を一緒に使用することで、データ変数が次の場合にのみロードされるようになります。 getData 関数が初めて呼び出され、初期化以降の呼び出しでは、初期化されたデータが直接返されます。

概要:

sync.Once 関数は、単一実行を実現するために使用される Go 言語の重要な関数の 1 つです。ミューテックス ロックとアトミック操作を使用して、操作が 1 回だけ実行されるようにします。これは非常に便利で効率的です。実際の開発では、sync.Once 関数を最大限に活用して、コード ロジックを最適化し、パフォーマンスに影響を与える繰り返し実行を回避し、操作の一意性を確保できます。

この記事の分析とサンプルコードを通じて、読者の皆様は sync.Once 関数の使い方を習得し、実際のプロジェクトで柔軟に使用できるようになると思います。より高品質な Go 言語プログラムを作成するために一緒に働きましょう!

以上がGo 言語のドキュメント分析: sync.Once 関数は単一実行を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!