登录
首页 >  Golang >  Go问答

编写优雅且规范的 Go 包的方法

来源:stackoverflow

时间:2024-03-19 15:51:29 210浏览 收藏

Go 中实现稀疏集并将其打包成一个包时,为了保持 API 干净和最小化,作者面临添加新功能(自动保留元素)的挑战。由于不能添加新导出类型,作者探索了使用接口、使用相同的结构以及使用 k...int 作为参数等方法,最终采用后者来实现新功能。

问题内容

我尝试在 Go 中实现本文中的稀疏集并将其打包成一个包。在早期实现中,API 是干净且最小的,仅导出类型 Sparse 和导出方法 InsertDeleteHasUnionIntersectionClearzqben dczqb 和 Len,几乎只是基本的集合操作。

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

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

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

这是我已经尝试过的:

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

解决方案


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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《编写优雅且规范的 Go 包的方法》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>