英文:
Syntax Error: Non-declaration statement outside function body
问题
函数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语言编程入门》一书。我不确定问题出在哪里。
英文:
The function makeEvenGenerator
is supposed to return a function that generates even numbers in a sequential manner:
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
}
When I run it, I get the error syntax error: unexpected func, expecting semicolon or newline
and Non-declaration statement outside function body
.
The code is taken verbatim from An Introduction to Programming in Go by Caleb Doxsey. I am not sure what the problem is.
答案1
得分: 5
你在makeEvenGenerator
的末尾的}
和main
中的func
之间缺少一个换行符。
我已经修复了这个错误,并将代码发布到了playground。
英文:
You are missing a newline between the "}" at the end of the makeEvenGenerator
and the "func" in main
.
I fixed the error and posted the code to the playground.
答案2
得分: 5
有关分号的规则。
> Go编程语言规范
>
> 分号
>
> 正式的语法在许多产生式中使用分号“;”作为终止符号。Go程序可以使用以下两个规则省略大部分分号:
>
> 1. 当输入被分解为标记时,如果行的最后一个标记是
> 标识符
> 整数、浮点数、虚数、符文或字符串字面量
> 关键字break、continue、fallthrough或return之一
> 运算符和分隔符++、--、)、]或}
> 那么自动在标记流的末尾插入一个分号。
> 2. 为了允许复杂语句占据一行,可以在闭合的“)”或“}”之前省略分号。
错误在这里,
}func main() {
修改为,
}
func main() {
英文:
There are rules about semicolons.
> The Go Programming Language Specification
>
> Semicolons
>
> The formal grammar uses semicolons ";" as terminators in a number of
> productions. Go programs may omit most of these semicolons using the
> following two rules:
>
> 1. When the input is broken into tokens, a semicolon is automatically inserted into the token stream at the end of a non-blank line if the
> line's final token is
> an identifier
> an integer, floating-point, imaginary, rune, or string literal
> one of the keywords break, continue, fallthrough, or return
> one of the operators and delimiters ++, --, ), ], or }
> 2. To allow complex statements to occupy a single line, a semicolon may be omitted before a closing ")" or "}".
The error is here,
}func main() {
Write,
}
func main() {
答案3
得分: 4
你在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)
}
}
[playground](http://play.golang.org/p/1HklcNfI-w)
英文:
You were missing a new line between }
at the end of makeEvenGenerator
and func main
.
Also an alternative approach for that pattern is to use a channel not return a function:
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)
}
}
<kbd>playground</kbd>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论