Ответ
Да, это допустимо. В Go, как и для других сущностей (переменных, функций, типов), регистр первой буквы имени метода определяет его видимость (экспортируемость).
- Метод с большой буквы (
PublicMethod()
) является экспортируемым и доступен из других пакетов. - Метод с маленькой буквы (
privateMethod()
) является неэкспортируемым и доступен только внутри того пакета, где он объявлен.
package mypackage
type MyInterface interface {
privateMethod() // Доступен только в пакете 'mypackage'
PublicMethod() // Доступен везде, где импортирован 'mypackage'
}
Когда это может быть полезно?
Хотя интерфейсы чаще всего определяют публичный контракт, неэкспортируемые методы — это мощный инструмент для дизайна пакетов:
- Создание "запечатанных" интерфейсов: Если интерфейс содержит хотя бы один неэкспортируемый метод, ни один тип за пределами текущего пакета не сможет его реализовать. Это позволяет автору пакета полностью контролировать все возможные реализации интерфейса.
- Внутренние контракты: Для обеспечения определенного поведения у группы типов внутри одного пакета, не выставляя эти детали реализации наружу.
- Тестирование: Для создания моков и стабов, которые должны имитировать внутреннее поведение, недоступное извне.