@harliy

Можно ли изменять неимпортируемые поля структуры в других пакетах программы?

Смотрел реализацию кэша в инете. Кэш имеет неимпортируемые поля:
type Cache struct {
    sync.RWMutex
    defaultExpiration time.Duration
    cleanupInterval   time.Duration
    items             map[string]Item
}

type Item struct {
    Value      interface{}
    Created    time.Time
    Expiration int64
}


У структуры Cache есть методы Get и Set. Вызываются они на существующем экземпляре кэша, соответственно, чтобы их использовать мне нужно создать экземпляр структуры с помощью функции New:

func New(defaultExpiration, interval time.Duration) *Cache {
	data := make(map[string]Data)

	cache := Cache{
		items:             data,
		defaultExpiration: defaultExpiration,
		cleanUpInterval:   interval,
	}

	return &cache
}


Если мне нужно будет добавлять в кэш данные из разных пакетов программы, то мне нужно создавать экземпляры в каждом из пакетов? Получится несколько кэшей, а хотелось бы создать один и туда добавлять данные. Как это сделать? На ум приходит только создание глобальной переменной, а я слышал, что это сомнительная практика и лучше её избегать
  • Вопрос задан
  • 106 просмотров
Решения вопроса 2
Не понял, в чем проблема. Есть у вас пакет cache, внутри тип Cache и функция New

Так как функция New экспортируемая, вызываете ее из любого пакета и создаете себе экземпляр кэша. Потом этот экземпляр через dependency injection кладете во все нужные вам экземпляры сервисов.
Ответ написан
Комментировать
Maksclub
@Maksclub
maksfedorov.ru
Если у вас в разных частях программы нужен один кеш — то на уровне выше, где создаются эти части программы передавайте один и тот же инстанс

Инстанс храните в DI-контейнере или синглтоне или просто создавайте в одном месте нужные части и/или прокидывайте зависимости руками :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
DollyPapper
@DollyPapper
Возможно уже неактуально, но.
Не следует строго следовать мантрам про "глобальные переменные это плохо". Иногда это необходимо. Делаете из своего кеша синглтон (как его правильно делать в го можно посмотреть в инете). Переменная инстанс самого обьекта кэша будет лежать на уровне пакета кэша и будет неэкспортируемой. А сама New будет возвращать либо кэш, если он уже ранее был создан, либо тот инстанс который был создан. Так например pgxpool устроен ЕМНИП.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы