Создание экземпляра одноэлементного объекта — это способ гарантировать, что будет создан только один экземпляр класса.
В этом посте я продемонстрирую различные способы создания экземпляра одноэлементного объекта.
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) }
Окончательно
Создание экземпляра одноэлементного объекта — это очень простой шаблон программирования; Надеюсь, вам понравился этот пост :)
Спасибо за прочтение.