экспортируемая структура, у которой есть неэкспортируемое поле типа map[string]
и пару экспортируемых методов Add(s SomeType) error и Read(key string) SomeType.
Add добавляет в мапу.
Есть не юзать конструктор, то такая структура не будет useful, так как мапа по умолчанию nil и при попытке вызова метода Add будет паника.
Оправдано ли в таком случае при вызове метода Add проверять мапу на nil? Или инициализировать мапу через sync.once.Do(func())
Или легче просто сделать конструктор в котором сами инициализируем нужные поля и если пользователи пакета создали инстанс структуры не через конструктор, значит считаем, что они не корректно используют нашу либу?
Я бы с вероятностью 100% сделал бы конструктор. А структуру же можно неэкспортируемой сделать. А вообще где-то была статья про "структура или конструктор"
можно сделать неэкспортируемую структуру, но тогда возвращаем интерфейс? И нарушаем еще один принцип: "accept interfaces, return concrete types"
Но можно вернуть неэкспортируемую структуру. Линтер какой-то ругнется, но я так и не понял, зачем..
Я бы тоже делал конструктор и не парился – если впоследствии появятся внешние зависимости, то сильно рефакторить не придется.
Обсуждают сегодня