函数makeEvenGenerator
应该返回一个按顺序生成偶数的函数:
package main
import "fmt"
func makeEvenGenerator() func() uint {
i := uint(0)
return func() (ret uint) {
ret = i
i += 2
return
}
}func main() {
nextEven := makeEvenGenerator()
fmt.Println(nextEven()) // 0
fmt.Println(nextEven()) // 2
fmt.Println(nextEven()) // 4
}
运行时,我收到错误syntax error: unexpected func, expecting semicolon or newline
和Non-declaration statement outside function body
。
代码是由Caleb Doxsey的 Go in Go Introduction to Go 逐字记录的。我不确定问题是什么。
答案 0 :(得分:5)
有关于分号的规则。
The Go Programming Language Specification
正式语法使用分号";"作为许多人的终结者 制作。 Go程序可能会使用这些分号省略大多数这些分号 遵循两条规则:
- 当输入被分解为令牌时,如果是分号,则会在非空白行的末尾自动将分号插入到令牌流中 line的最后一个标记是 标识符 整数,浮点,虚数,符文或字符串文字 其中一个关键字是break,continue,fallthrough或return 其中一个运算符和分隔符++, - ,),]或}}
- 为了允许复杂的语句占用一行,在结束之前可以省略分号")"或"}"。
醇>
错误在这里,
}func main() {
写入,
}
func main() {
答案 1 :(得分:4)
您在makeEvenGenerator
末尾的“}”和main
中的“func”之间缺少换行符。
我修正了错误并将代码发布到playground。
答案 2 :(得分:3)
您在}
和makeEvenGenerator
末尾的func main
之间错过了新的一行。
该模式的另一种方法是使用不返回函数的通道:
func evenGenerator() <-chan uint {
ch := make(chan uint)
go func() {
i := uint(0)
for {
ch <- i
i += 2
}
}()
return ch
}
func main() {
evens := evenGenerator()
for i := 0; i < 3; i++ {
fmt.Println(<-evens)
}
}