検索
ホームページバックエンド開発GolangGo 言語のドキュメント分析: sync.Once 関数は単一実行を実装します

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

Nov 03, 2023 am 08:28 AM
言語を移動文書の解析同期機能

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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Golang vs. Python:並行性とマルチスレッドGolang vs. Python:並行性とマルチスレッドApr 17, 2025 am 12:20 AM

Golangは高い並行性タスクにより適していますが、Pythonには柔軟性がより多くの利点があります。 1.Golangは、GoroutineとChannelを介して並行性を効率的に処理します。 2。Pythonは、GILの影響を受けるが、複数の並行性メソッドを提供するスレッドとAsyncioに依存しています。選択は、特定のニーズに基づいている必要があります。

GolangとC:パフォーマンスのトレードオフGolangとC:パフォーマンスのトレードオフApr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

Golang vs. Python:アプリケーションとユースケースGolang vs. Python:アプリケーションとユースケースApr 17, 2025 am 12:17 AM

seetgolangforhighperformance andconcurrency、ithyforbackendservicesandnetworkプログラミング、selectthonforrapiddevelopment、datascience、andmachinelearningduetoistsversitydextentextensextensentensiveLibraries。

Golang vs. Python:重要な違​​いと類似点Golang vs. Python:重要な違​​いと類似点Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golang vs. Python:使いやすさと学習曲線Golang vs. Python:使いやすさと学習曲線Apr 17, 2025 am 12:12 AM

GolangとPythonはどのような側面で使いやすく、より滑らかな学習曲線を持っていますか? Golangは、高い並行性と高性能のニーズにより適しており、学習曲線はC言語の背景を持つ開発者にとって比較的穏やかです。 Pythonは、データサイエンスと迅速なプロトタイピングにより適しており、初心者にとって学習曲線は非常にスムーズです。

パフォーマンスレース:ゴラン対cパフォーマンスレース:ゴラン対cApr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Golang vs. C:コードの例とパフォーマンス分析Golang vs. C:コードの例とパフォーマンス分析Apr 15, 2025 am 12:03 AM

Golangは迅速な発展と同時プログラミングに適していますが、Cは極端なパフォーマンスと基礎となる制御を必要とするプロジェクトにより適しています。 1)Golangの並行性モデルは、GoroutineとChannelを介した同時性プログラミングを簡素化します。 2)Cのテンプレートプログラミングは、一般的なコードとパフォーマンスの最適化を提供します。 3)Golangのごみ収集は便利ですが、パフォーマンスに影響を与える可能性があります。 Cのメモリ管理は複雑ですが、コントロールは問題ありません。

Golangの影響:速度、効率、シンプルさGolangの影響:速度、効率、シンプルさApr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール