go init函式 Go語言設計模式 單例

2021-10-11 08:48:25 字數 2355 閱讀 1223

單體設計模式是一種建立型的設計模式,也是最常用的設計模式之一。只允許結構體的乙個例項存在時才使用此模式。這個唯一例項稱為單例物件。單例物件適用的情況有:

單例例項是在結構體首次初始化時建立的。通常,為只需要建立乙個例項的結構體定義getinstance方法。一旦建立之後,getinstance每次都返回同乙個單例例項。

go中有協程goroutines。因此,當多個協程嘗試訪問該例項時,單例結構應返回同一例項。很容易弄錯單例設計模式,下面的**演示了建立單例物件的正確方法。

上面的**確保只會建立乙個single結構的例項。有一點值得注意。

在開始時檢查singleinstance是否為nil,這是為了防止每次呼叫getinstance方法時代價高昂的鎖操作。如果此檢查失敗,則表示已經建立了singleinstance。singleinstance是在鎖內建立的。在獲取鎖後,將再次檢查singleinstance是否為nil。這是為了確保如果多個協程同時通過第乙個檢查,那麼只有乙個協程能夠建立單例例項,否則這些協程都將建立各自的single結構的例項。

single.go是single結構的**:

main.go是使用使用單例結構的**:

結果:creting single instance now

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-2

single instance already created-2

single instance already created-2

single instance already created-2

single instance already created-2

single instance already created-2

single instance already created-2

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-2

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

single instance already created-1

注意: 在go中建立單例物件的其他方法:

我們可以在init函式中建立單例。這僅適用於物件可在早期進行初始化的情況。包中的每個檔案只呼叫一次init函式,因此我們可以確保只會建立乙個例項。

sync.once用於只執行一次的操作。見下面的**:

結果:creting single instance now

single instance already created-2

single instance already created-2

go init函式 面試錄 Go語言篇 記憶體模型

問 了解過go的記憶體模型嗎?大概講一講 答 go記憶體模型指定了一系列條件,在這些條件下,可以保證在乙個goroutine中讀取變數可以觀察到其他goroutine中對同一變數所寫的值。即安全的在不同的協程中讀寫變數。問 為什麼需要有這些條件呢?答 編譯器或處理器不保證指令執行順序和程式書寫順序一...

Go語言 函式

函式是結構化程式設計的最小模組單元,使用關鍵字 func 定義函式。go語言定義函式的一些特點總結如下 無需前置宣告 不支援命名巢狀定義 不支援同名函式過載 不支援預設引數 支援不定長變參 支援多返回值 支援命名返回值 支援匿名函式和閉包 函式屬於第一類物件,具備相同簽名 引數及返回值型別 的視為同...

Go語言函式

go語言函式function go函式不支援巢狀 過載和預設引數 但支援以下特性 無需宣告原型 不定長度引數 多返回值 命名返回值引數 匿名函式 閉包 定義函式使用關鍵字func,且左大括號不能另起一行 函式也可以作為一種型別使用 不定引數 不定引數的傳遞 任意型別的不定引數 如果你希望傳任意型別的...