Go:抽象可迭代

假设我想有一个应该的方法要么返回一个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 来说是“糟糕的”,我应该考虑其他事情吗?


慕村9548890
浏览 163回答 3
3回答

SMILET

或者,也许整个设计对 Go 来说是“糟糕的”,我应该考虑其他事情吗?虽然您可以在类型之上构建一些接口,以便您可以像处理它们一样处理它们,但我会说这是一个糟糕的选择。更简单的方法是利用多种返回类型并chan myType, []myType, error为其返回定义 func ,然后只使用 3 路 if-else 来检查错误,然后是 chan 或 slice。像往常一样读取通道,像往常一样迭代切片。将可以运行的代码放在myType辅助方法中,以便您可以从两个控制流中调用它。我的钱说这不再是代码,它也更加直接。我不必通读一些抽象来理解我有一个通道和随之而来的继承并发症(chan 和 slice 是不协调的,所以试图对它们建模听起来像一场噩梦),相反,你只需要程序控制流中的一个额外步骤。

神不在的星期二

我参加聚会有点晚了,但如果你真的需要一些“抽象可迭代”,你可以创建一个这样的界面:type Iterable interface {    Next() (int, error)}(灵感来自sql.Rows。)然后,您可以像这样使用它:for n, err := iter.Next(); err != nil; n, err = iter.Next() {    fmt.Println(n)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go