扩展库的结构/接口

时间:2019-04-06 10:05:37

标签: go

用例

我正在使用Shopify的sarama库,它是一个客户端库。更具体地说,我使用的是很棒的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.ClusterAdmin(sarama.ClusterAdmin是接口类型)”。如何通过自己的方法扩展struct / interface?

1 个答案:

答案 0 :(得分:4)

无法将接口扩展到其程序包之外。

您可以做的是定义一个实现旧接口的新接口,然后将新方法添加到新接口。例如:

type ExtendedClusterAdmin interface {
   sarama.ClusterAdmin
   ListDetailedtopics()
}

如果要在包内使用私有功能,则必须在包本身内使用它。例如,带有补丁。