#go
#Вперед
Вопрос:
Пример использования
Я использую Shopify sarama libary, которая является клиентской библиотекой. Более конкретно, я использую ClusterAdmin
структуру, которая великолепна, однако я хочу добавить к ней другой метод ListDetailedTopics
, и я должен вызвать непубличные методы ClusterAdmin.
https://github.com/Shopify/sarama/blob/master/admin.go
Проблема
Я не уверен, как я мог бы «расширить» экспортированную структуру своим собственным методом. Я пробовал это:
func (ca *sarama.ClusterAdmin) ListDetailedtopics() {
b, err := ca.findAnyBroker() // This is a private method I need to call
}
Это не сработало, потому что «недопустимый тип получателя * sarama.Администратор кластера (sarama.ClusterAdmin — это тип интерфейса)». Как я могу расширить структуру / интерфейс своими собственными методами?
Ответ №1:
Вы не можете расширить интерфейс за пределы его пакета.
Вместо этого вы можете определить новый интерфейс, который реализует старый интерфейс, а затем добавить свой новый метод в новый интерфейс. Например:
type ExtendedClusterAdmin interface {
sarama.ClusterAdmin
ListDetailedtopics()
}
Если вы хотите использовать закрытую функцию внутри пакета, вам придется делать это внутри самого пакета. Например, с помощью исправления.
Комментарии:
1. Uff буквально я могу создавать оболочки только вокруг экспортируемых типов, поскольку я не могу вызывать какие-либо частные методы?
2. на самом деле
sarama.ClusterAdmin
это должно быть реализовано самостоятельно, если это необходимо. Просто скопируйте структуру, реализующую ее, и добавьте все, что вам нужно. Я не думаю, что вам нужно расширять сам интерфейс.