以下代码将永远打印
0
和 1
:
package main
import "fmt"
func main() {
i := 0
for {
i = 1 - i // special effect, `i = one minus i`
fmt.Println(i). // will always result in 1 or 0 when
} // i starts out as a 1 or 0
}
以下是我发现的产生此类迭代的另一种方法:
func loop(i int) {
for ; twoThings[i] != x.ActiveThing; loop(1 - i) {
twoThings[i].ChangeThings()
}
}
有更简洁的方法吗?我知道 Go 有
iota
但我不认为它可以像这样工作。
我不确定这里的目标是什么。根据“简洁”的含义,答案可以是“是”、“否”或“视情况而定”。 :)
在你的第二个例子中,你引入了与循环分开的符号,所以看起来你的目标是孤立地循环(或
main()
)的简洁性,而不是整体解决方案。
但是,第二个例子也不能与第一个例子直接比较。第一个是完整的程序,而第二个是需要额外调用代码的函数。
因此,我将其作为第一个示例(即完整程序)的直接可比替代方案,从第二个示例中获取线索,将代码移出循环并移入单独的包函数和变量中:
package main
var i int = 0
func result() int { i = 1 - i; return i }
func main() {
for {
println(result())
}
}
忽略不可执行的
import "fmt"
的消除,就LOC而言,整体解决方案并不比最初的示例更简洁,但是当单独考虑时,main()
函数和循环代码是(单独或一起)。