我尝试通过Go中的article实现稀疏集并将其打包。在早期实施中,该API干净整洁,仅使用导出类型Sparse
和导出方法Insert
,Delete
,Has
,Union
,{{1} },Intersection
和Clear
,几乎只有基本的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的简洁和最小化?
这是我已经尝试过的:
AutoSparse
来隐藏实现,但是功能签名是不同的,一个使用interface
,另一个使用Insert(k int)
,即使我使用名称Reserve()
仍然不同,还是应该使用Insert()
但根本不使用Insert(k int)
?可以,但是很尴尬。k
来实现这一点,因为一旦您使用struct
添加元素,就无法使用Reserve()
,因为它会弄乱保留的元素,甚至Insert(k int)
和Delete
也不同。答案 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")
}
}