Analisis dokumen bahasa Go: sync.Once fungsi melaksanakan satu pelaksanaan

王林
Lepaskan: 2023-11-03 08:28:50
asal
2113 orang telah melayarinya

Analisis dokumen bahasa Go: sync.Once fungsi melaksanakan satu pelaksanaan

Analisis dokumen bahasa Go: penyegerakan.Setelah fungsi melaksanakan satu pelaksanaan, contoh kod khusus diperlukan

Pakej penyegerakan dalam bahasa Go menyediakan Beberapa fungsi dan jenis untuk operasi segerak. Satu fungsi yang sangat berguna ialah penyegerakan. Sekali, yang memastikan bahawa operasi dilakukan sekali sahaja. Dalam artikel ini, kami akan menganalisis penggunaan penyegerakan. Setelah berfungsi secara terperinci dan memberikan beberapa contoh kod tertentu.

sync.Once fungsi ditakrifkan seperti berikut:

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)
    }
}
Salin selepas log masuk

Seperti yang anda boleh lihat, struktur penyegerakan.Once mengandungi mutex (Mutex) dan bendera yang telah selesai sama ada operasi telah dijalankan. Kaedah Do bagi struktur Sekali ialah logik teras untuk mencapai pelaksanaan tunggal.

Kaedah Lakukan terlebih dahulu menyemak sama ada bendera yang dilakukan ialah 1 melalui operasi atom atom.LoadUint32. Jika ia adalah 1, ia bermakna bahawa operasi telah dijalankan dan kembali secara langsung. Jika tidak, dapatkan mutex dan semak semula sama ada bendera yang dilakukan ialah 0. Jika ia adalah 0, laksanakan fungsi yang diluluskan f dan tetapkan bendera selesai kepada 1 melalui operasi atom atomic.StoreUint32 untuk memastikan bahawa f tidak akan dilaksanakan apabila ia dipanggil seterusnya.

Berikut ialah contoh mudah yang menunjukkan cara menggunakan penyegerakan.Setelah berfungsi untuk mencapai satu pelaksanaan:

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.")
        })
    }
}
Salin selepas log masuk

Jalankan kod di atas, output adalah seperti berikut:

This will only print once.
Salin selepas log masuk

Ia boleh dilihat bahawa walaupun kaedah sekali. Lakukan dipanggil beberapa kali dalam gelung, hanya panggilan pertama yang benar-benar akan melaksanakan fungsi yang diluluskan, dan panggilan berikutnya akan kembali terus tanpa melaksanakannya semula .

sync.Once fungsi mempunyai pelbagai senario penggunaan. Sebagai contoh, apabila memulakan pembolehubah global, kami biasanya mahu melakukan pengamulaan sekali sahaja, bukannya memulakan pembolehubah itu setiap kali pembolehubah itu diakses. Pada ketika ini, anda boleh menggunakan fungsi sync.Once untuk memastikan bahawa permulaan hanya dilakukan sekali.

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())
}
Salin selepas log masuk

Jalankan kod di atas, hasil output adalah seperti berikut:

[Hello World]
[Hello World]
Salin selepas log masuk

Dengan menggunakan penyegerakan.Setelah fungsi dan fungsi loadData bersama-sama, kami memastikan pembolehubah data akan hanya dipanggil buat kali pertama Fungsi getData dimulakan, dan panggilan berikutnya terus mengembalikan data yang dimulakan.

Ringkasan:

sync.Once function ialah salah satu fungsi penting dalam bahasa Go untuk mencapai satu pelaksanaan. Ia menggunakan kunci mutex dan operasi atom untuk memastikan bahawa operasi hanya dilaksanakan sekali, yang sangat mudah dan cekap. Dalam pembangunan sebenar, kita boleh menggunakan sepenuhnya penyegerakan. Setelah berfungsi untuk mengoptimumkan logik kod, elakkan pelaksanaan berulang yang menjejaskan prestasi dan memastikan keunikan operasi.

Melalui analisis dan kod sampel artikel ini, saya percaya pembaca boleh menguasai penggunaan penyegerakan. Setelah berfungsi dan boleh menggunakannya secara fleksibel dalam projek sebenar. Marilah kita bekerjasama untuk menulis program bahasa Go yang berkualiti tinggi!

Atas ialah kandungan terperinci Analisis dokumen bahasa Go: sync.Once fungsi melaksanakan satu pelaksanaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!