用例
我正在使用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?
答案 0 :(得分:4)
您无法将接口扩展到其程序包之外。
您可以做的是定义一个实现旧接口的新接口,然后将新方法添加到新接口。例如:
type ExtendedClusterAdmin interface {
sarama.ClusterAdmin
ListDetailedtopics()
}
如果要在包内使用私有功能,则必须在包本身内使用它。例如,带有补丁。