为了账号安全,请及时绑定邮箱和手机立即绑定

Go:抽象可迭代

Go:抽象可迭代

Go
慕村9548890 2021-10-18 16:58:46
假设我想有一个应该的方法要么返回一个chan 或一个slice。例如,chan如果我想在新行出现时“跟随”一个文件,我需要一个,如果我只想读取和返回现有行,我需要一个切片。在这两种情况下,我只需要遍历这个返回值。这是 Python 中的一个抽象示例(与文件无关,但显示了这个想法):def get_iterable(self):    if self.some_flag:        return (x for x in self.some_iterable)    return [x for x in self.some_iterable]def do_stuff(self):    items = self.get_iterable()    for item in items:        self.process(item)现在,我在 Go 中很难做到这一点。我想我应该寻找类似“可迭代界面”的东西,我应该返回它,但我没有在谷歌上搜索一些现成的解决方案(对不起,如果这只是我糟糕的谷歌搜索技能)。做我想做的最好的方法是什么?或者,也许整个设计对 Go 来说是“糟糕的”,我应该考虑其他事情吗?
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

或者,也许整个设计对 Go 来说是“糟糕的”,我应该考虑其他事情吗?

虽然您可以在类型之上构建一些接口,以便您可以像处理它们一样处理它们,但我会说这是一个糟糕的选择。更简单的方法是利用多种返回类型并chan myType, []myType, error为其返回定义 func ,然后只使用 3 路 if-else 来检查错误,然后是 chan 或 slice。像往常一样读取通道,像往常一样迭代切片。将可以运行的代码放在myType辅助方法中,以便您可以从两个控制流中调用它。

我的钱说这不再是代码,它也更加直接。我不必通读一些抽象来理解我有一个通道和随之而来的继承并发症(chan 和 slice 是不协调的,所以试图对它们建模听起来像一场噩梦),相反,你只需要程序控制流中的一个额外步骤。


查看完整回答
反对 回复 2021-10-18
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

我参加聚会有点晚了,但如果你真的需要一些“抽象可迭代”,你可以创建一个这样的界面:


type Iterable interface {

    Next() (int, error)

}

(灵感来自sql.Rows。)


然后,您可以像这样使用它:


for n, err := iter.Next(); err != nil; n, err = iter.Next() {

    fmt.Println(n)

}


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信