【问题标题】:Extending a library's struct/interface扩展库的结构/接口
【发布时间】:2019-04-06 18:17:47
【问题描述】:

用例

我正在使用 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 是一种接口类型)”。如何通过自己的方法扩展结构/接口?

【问题讨论】:

    标签: go


    【解决方案1】:

    您不能将接口扩展到其包之​​外。

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

    type ExtendedClusterAdmin interface {
       sarama.ClusterAdmin
       ListDetailedtopics()
    }
    

    如果你想在包中使用私有函数,那么你必须在包本身内部进行。例如,使用补丁。

    【讨论】:

    • 嗯,我只能围绕导出的类型创建包装器,因为我不能调用任何私有方法?
    • 其实sarama.ClusterAdmin是需要自己实现的。只需复制实现它的结构并添加您需要的任何内容。我认为您不需要扩展接口本身。
    猜你喜欢
    • 2015-05-16
    • 2015-08-09
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2023-03-30
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多