如何编写简洁的Go程序包?

时间:2018-11-13 11:48:01

标签: go package

我尝试通过Go中的article实现稀疏集并将其打包。在早期实施中,该API干净整洁,仅使用导出类型Sparse和导出方法InsertDeleteHasUnion,{{1} },IntersectionClear,几乎只有基本的set操作。

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

如您所见,为了维持要添加到集合中的元素,它不会在{0 1 2 4 5 3}中添加新字段,我希望保持这种状态。

我的问题是如何在不添加新导出类型struct的情况下将新功能添加到我的软件包中,以保持API的简洁和最小化?

这是我已经尝试过的:

  1. 我可以使用AutoSparse来隐藏实现,但是功能签名是不同的,一个使用interface,另一个使用Insert(k int),即使我使用名称Reserve()仍然不同,还是应该使用Insert()但根本不使用Insert(k int)?可以,但是很尴尬。
  2. 我无法使用相同的k来实现这一点,因为一旦您使用struct添加元素,就无法使用Reserve(),因为它会弄乱保留的元素,甚至Insert(k int)Delete也不同。

1 个答案:

答案 0 :(得分:2)

您可以使用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")
    }
}