假设我想有一个应该的方法要么返回一个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 是不协调的,所以试图对它们建模听起来像一场噩梦),相反,你只需要程序控制流中的一个额外步骤。
神不在的星期二
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)
}
- 3 回答
- 0 关注
- 162 浏览
添加回答
举报
0/150
提交
取消