在Go中,您可以执行以下操作:if foo := bar() ; foo != nil { ...}在C / C ++中,您可以执行以下操作:while ((foo = bar()) != NULL) { ...}但是,Go的语法似乎没有提供在while循环中进行分配和比较的任何等效方法。Go已替换while为的特定调用for(例如for a等价于for ; a ;)。仅仅尝试使用if版本语法会混淆解析器,因为它期望有第三条语句。我可以说:for foo := bar() ; foo != nil ; foo = bar() { ....}但是在这种情况下,bar()调用是相当长,复杂的,并且不容易分解成自己的函数(尽管我可以做一些声明func要调用的局部调用的操作,但这仍然会降低代码的清晰度)。现在我正在做:for { foo := bar(); if foo == nil { break; } ...}但这似乎是不干净的,这既是因为它将循环条件与循环语句本身分开,又是因为它依赖于break。那么,在Go的while循环中是否有一种干净,惯用的方式来进行分配和比较?这是一个如此常见的用例,我无法想象没有办法做到。
2 回答
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
您可以创建类似于bufio#Scanner.Scan的迭代器:
package main
type Bar struct {
Foo int
}
func (o *Bar) Next() bool {
o.Foo++
return o.Foo < 10
}
func main() {
var o Bar
for o.Next() {
println(o.Foo)
}
}
然后Next,您可以在函数中放入所需的所有复杂逻辑。
- 2 回答
- 0 关注
- 182 浏览
添加回答
举报
0/150
提交
取消