Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis mendalam tentang corak tunggal dalam bahasa Go

Analisis mendalam tentang corak tunggal dalam bahasa Go

青灯夜游
青灯夜游asal
2023-03-21 18:36:452546semak imbas

Corak tunggal ialah corak reka bentuk biasa yang membenarkan hanya satu kejadian dibuat dalam sistem untuk mengawal akses kepada sumber tertentu. Dalam bahasa Go, terdapat banyak cara untuk melaksanakan corak tunggal Artikel ini akan memberi anda pemahaman yang mendalam tentang pelaksanaan corak tunggal dalam bahasa Go.

Analisis mendalam tentang corak tunggal dalam bahasa Go

Apakah corak tunggal

Corak tunggal merujuk kepada corak reka bentuk yang hanya membenarkan penciptaan satu objek. Ia biasanya digunakan untuk mengawal akses kepada sumber tertentu, seperti sambungan pangkalan data, kumpulan benang, dsb. Melalui mod tunggal, anda boleh memastikan bahawa hanya satu contoh wujud dalam sistem dan menyediakan pusat akses global untuk digunakan oleh objek lain.

Cara melaksanakan corak tunggal dalam Go

Bahasa Go menyediakan pelbagai cara untuk melaksanakan corak tunggal, termasuk kaedah berikut:

Kaedah 1: Gaya malas

Gaya malas ialah cara biasa untuk melaksanakan corak tunggal, yang dicirikan dengan mencipta tika tunggal apabila ia mula digunakan. Kaedah pelaksanaan adalah seperti berikut:

package singleton

import "sync"

var (
	instance *Singleton
	once     sync.Once
)

type Singleton struct {
}

func GetInstance() *Singleton {
	once.Do(func() {
		instance = &Singleton{}
	})

	return instance
}

Dalam kod di atas, kami mentakrifkan struktur bernama Singleton dan menjadikannya sebagai contoh. Pada masa yang sama, gunakan objek penyegerakan.Once sekali dalam pakej penyegerakan untuk melaksanakan logik yang dilaksanakan sekali sahaja semasa kitaran hayat program. Apabila GetInstance dipanggil buat kali pertama, kaedah Do Sync.Once akan memanggil fungsi yang diluluskan Logik fungsi ini adalah untuk menjadikan objek Singleton dan menetapkannya kepada contoh. Dalam panggilan seterusnya ke GetInstance, oleh kerana contoh telah dibuat seketika, ia tidak akan dibuat lagi.

Kaedah 2: Gaya Cina Lapar

Gaya Cina Lapar ialah satu lagi cara biasa untuk melaksanakan corak tunggal, yang dicirikan dengan mencipta satu tunggal apabila sistem bermula , instance dikembalikan terus apabila dipanggil. Kaedah pelaksanaan adalah seperti berikut:

package singleton

var instance *Singleton = &Singleton{}

type Singleton struct {
}

func GetInstance() *Singleton {
	return instance
}

Dalam kod di atas, kami mencipta objek Singleton semasa pemulaan pakej dan menetapkannya sebagai contoh. Kaedah GetInstace mengembalikan contoh secara langsung, jadi setiap panggilan mengembalikan objek yang sama, mencapai tujuan mengawal tika objek.

Kaedah 3: Penguncian semak dua kali

Pengunci semakan dua kali ialah pelaksanaan mod tunggal yang digunakan dalam persekitaran berbilang benang Ciri-cirinya adalah untuk menyemak dahulu sama ada telah Terdapat contoh Jika tidak, masukkan blok kod disegerakkan untuk menciptanya. Kaedah pelaksanaan adalah seperti berikut:

package singleton

import "sync"

var (
	instance *Singleton
	mu       sync.Mutex
)

type Singleton struct {
}

func GetInstance() *Singleton {
	if instance == nil {
		mu.Lock()
		defer mu.Unlock()
		if instance == nil {
			instance = &Singleton{}
		}
	}
	return instance
}

Dalam kod di atas, kami menggunakan kunci mutex untuk melaksanakan kawalan konkurensi bagi memastikan hanya satu utas boleh mengakses sumber kritikal dalam persekitaran berbilang benang. Pada masa yang sama, mekanisme semakan dua kali digunakan untuk mengurangkan kekerapan penggunaan kunci mutex.

Contoh

Melalui contoh berikut, kita boleh memahami cara menggunakan corak tunggal untuk melaksanakan caching data.

package main

import (
	"fmt"
	"sync"
)

type Cache struct {
	store map[string]string
	mu    sync.Mutex
}

var instance *Cache

func GetCacheInstance() *Cache {
	if instance == nil {
		instance = &Cache{
			store: make(map[string]string),
		}
	}
	return instance
}

func (c *Cache) Get(key string) (string, bool) {
	c.mu.Lock()
	defer c.mu.Unlock()

	val, ok := c.store[key]
	return val, ok
}

func (c *Cache) Set(key, val string) {
	c.mu.Lock()
	defer c.mu.Unlock()

	c.store[key] = val
}

func main() {
	cache := GetCacheInstance()

	cache.Set("name", "Tom")
	if val, ok := cache.Get("name"); ok {
		fmt.Println(val)
	}
}

Dalam kod di atas, kami mentakrifkan struktur Cache untuk mewakili cache data. Cache mengandungi pembolehubah ahli kedai untuk menyimpan pasangan nilai kunci dan menggunakan mutex mu untuk mengawal akses. Fungsi GetCacheInstance mengembalikan contoh Cache, yang mewakili cache data Apabila dipanggil buat kali pertama, tika itu akan dijadikan objek Cache. Fungsi utama dalam contoh menunjukkan cara menggunakan objek Cache tunggal untuk menyimpan dan mendapatkan data.

Ringkasan

Corak tunggal ialah corak reka bentuk biasa yang memastikan hanya satu kejadian wujud dalam sistem dan menyediakan pusat akses global. Dalam bahasa Go, terdapat banyak cara untuk melaksanakan corak tunggal, termasuk gaya malas, gaya lapar, penguncian semak dua kali, dsb. Melalui artikel ini, kami memahami butiran khusus kaedah pelaksanaan ini dan melaksanakan contoh caching data.

Pembelajaran yang disyorkan: Tutorial Golang

Atas ialah kandungan terperinci Analisis mendalam tentang corak tunggal dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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