【问题标题】:How to write nice and clean Go package? [closed]如何编写漂亮干净的 Go 包? [关闭]
【发布时间】:2018-11-13 22:52:26
【问题描述】:

我尝试在 Go 中从 article 实现稀疏集并将其放入一个包中。在早期实现中,API 是干净且最小的,只有导出类型 Sparse 和导出方法 InsertDeleteHasUnionIntersectionClearLen,漂亮很多只是基本的集合操作。

稍后,我想添加新功能,可以自动保留元素的集合(我们称之为AutoSparse)。如果Sparse 具有将k 插入集合的Insert(k int),则AutoSparse 具有Reserved() 保留一个可用元素。如果我在AutoSparse 中有{0 1 2 4 5},当我调用Reserve() 时,它必须加3,而不是6,所以现在它变成{0 1 2 4 5 3}。这是playground 的实现。

如您所见,为了维护要添加到集合中的元素,它不会在 struct 中添加新字段,我想保持这样。

我的问题是如何在不添加新导出类型AutoSparse 的情况下将新功能添加到我的包中以保持 API 干净和最小化?

这是我已经尝试过的:

  1. 我可以用interface隐藏实现,但是函数签名不同,一个用Insert(k int),另一个用Reserve(),即使我用名字Insert()还是不一样,还是应该用Insert(k int)但根本没有使用k?可以,但很尴尬。
  2. 我不能使用相同的struct 来实现这个,因为一旦你使用Reserve() 添加元素,你就不能使用Insert(k int) 因为它会弄乱保留元素,甚至Delete 和@ 987654352@ 不同。

【问题讨论】:

    标签: go package


    【解决方案1】:

    您可以使用k... int 作为参数。

    func (sparse Sparse) Insert(k... int) error {
        if len(k) == 0 {
            // first case
            return nil
        } else if len(k) == 1 {
            // second case
            return nil
        } else {
            return errors.New("Too many arguments")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多