Расширение структуры / интерфейса библиотеки

#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 это должно быть реализовано самостоятельно, если это необходимо. Просто скопируйте структуру, реализующую ее, и добавьте все, что вам нужно. Я не думаю, что вам нужно расширять сам интерфейс.