Допустимо ли в интерфейсе Go объявлять методы, имена которых начинаются с маленькой буквы?

Ответ

Да, это допустимо. В Go, как и для других сущностей (переменных, функций, типов), регистр первой буквы имени метода определяет его видимость (экспортируемость).

  • Метод с большой буквы (PublicMethod()) является экспортируемым и доступен из других пакетов.
  • Метод с маленькой буквы (privateMethod()) является неэкспортируемым и доступен только внутри того пакета, где он объявлен.
package mypackage

type MyInterface interface {
    privateMethod() // Доступен только в пакете 'mypackage'
    PublicMethod()  // Доступен везде, где импортирован 'mypackage'
}

Когда это может быть полезно?

Хотя интерфейсы чаще всего определяют публичный контракт, неэкспортируемые методы — это мощный инструмент для дизайна пакетов:

  1. Создание "запечатанных" интерфейсов: Если интерфейс содержит хотя бы один неэкспортируемый метод, ни один тип за пределами текущего пакета не сможет его реализовать. Это позволяет автору пакета полностью контролировать все возможные реализации интерфейса.
  2. Внутренние контракты: Для обеспечения определенного поведения у группы типов внутри одного пакета, не выставляя эти детали реализации наружу.
  3. Тестирование: Для создания моков и стабов, которые должны имитировать внутреннее поведение, недоступное извне.