Создание экземпляра одноэлементного объекта — это способ гарантировать, что будет создан только один экземпляр класса.

В этом посте я продемонстрирую различные способы создания экземпляра одноэлементного объекта.

1. Переменная уровня пакета

Переменная, определенная в области пакета, доступна для всех файлов в одном пакете. Полезно обмениваться данными между различными функциями.

Мы можем создать одноэлементный объект, присвоив значение переменной в области пакета.

Например:

«abc.go»

package abc
import "time"
var StartTime = time.Now()

main.go

package main
import (
    "fmt"
    "time"
    "example.com/m/abc"
)
func main() {
    fmt.Println(abc.StartTime)
    time.Sleep(1 * time.Second)
    fmt.Println(abc.StartTime)
}

"результат":

2022-05-10 11:58:06.076867 +0800 CST m=+0.000095853
2022-05-10 11:58:06.076867 +0800 CST m=+0.000095853

Как мы и ожидали, синглтон objectStartTime один и тот же в двух последовательных вызовах.

2. функция инициализации

Функция functioninit — это предопределенная функция, которая вызывается при импорте пакета. Обычно он используется для инициализации определенного состояния пакета.

«abc.go»

package abc
import "time"
var StartTime time.Time

func init() {
    StartTime = time.Now()
}

3. Вызов функции из функции Main

В начале основной функции мы вызываем функцию initApp для инициализации некоторых переменных.

main.go

package main
import (
    "fmt"
    "time"
    )
var startTime time.Time
func initApp() {
    startTime = time.Now()
}
func main() {
    initApp()
    
    fmt.Println(startTime)
}

4. sync.Once

Иногда рекомендуется отложить дорогостоящий этап инициализации до того момента, когда он понадобится.

Пакет sync.Once — идеальный инструмент для такой ленивой инициализации и гарантирует, что мы запускаем коды инициализации только один раз.

«abc.go»

package abc
import (
    "sync"
    "time"
)
var (
    StartTime time.Time
    once      sync.Once
)
func InitStartTime() {
    once.Do(func() { 
        StartTime = time.Now()
    })
}

«главное.го»

package main
import (
    "fmt"
    "example.com/m/abc"
)
func main() {
    fmt.Println(abc.StartTime)
    abc.InitStartTime()
    fmt.Println(abc.StartTime)
}

Окончательно

Создание экземпляра одноэлементного объекта — это очень простой шаблон программирования; Надеюсь, вам понравился этот пост :)

Спасибо за прочтение.