Function 语法错误:函数体外的非声明语句
函数Function 语法错误:函数体外的非声明语句,function,go,closures,Function,Go,Closures,函数makeEvenGenerator应该返回一个按顺序生成偶数的函数: package main import "fmt" func makeEvenGenerator() func() uint { i := uint(0) return func() (ret uint) { ret = i i += 2 return } }func main() { nextEven := makeEvenGenerato
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
}
当我运行它时,我得到了错误语法错误:意外的func,需要分号或换行符和函数体之外的非声明语句
代码是从Caleb Doxsey在Go中的编程简介中逐字提取的。我不确定是什么问题 在makeEvenGenerator
末尾的“}”和main
中的“func”之间缺少一个换行符
我修复了错误并将代码发布到。您缺少makeEvenGenerator
末尾的“}”和main
中的“func”之间的换行符
我修复了错误并将代码发布到。您在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)
}
}
func evenGenerator()您在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)
}
}
func evenGenerator()分号有一些规则
形式语法在许多语法中使用分号“;”作为终结符
制作。Go程序可能会使用
以下两条规则:
当输入被分解为令牌时,如果
线路的最后标记是
标识符
整数、浮点、虚值、符文或字符串文字
关键字break、continue、fallthrough或return之一
运算符和分隔符之一++,-,),]或}
为了允许复杂语句占用一行,可以在结束“)”或“}”之前省略分号
错误就在这里
}func main() {
写,
}
func main() {
分号是有规则的
形式语法在许多语法中使用分号“;”作为终结符
制作。Go程序可能会使用
以下两条规则:
当输入被分解为令牌时,如果
线路的最后标记是
标识符
整数、浮点、虚值、符文或字符串文字
关键字break、continue、fallthrough或return之一
运算符和分隔符之一++,-,),]或}
为了允许复杂语句占用一行,可以在结束“)”或“}”之前省略分号
错误就在这里
}func main() {
写,
}
func main() {
哦,谢谢。我不认为编译器会关心那里的新行,因为这两部分是用大括号分开的。哦,谢谢。我不认为编译器关心新行,因为这两部分用大括号隔开。这是一种替代方法,而不是“通常的方法”。例如,在这种情况下,使用通道会有百分之一的性能损失,3481 ns/op比34.4 ns/op。@peterSO Good point,updated。顺便说一句,tip上的信道速度从1.411ns大幅提高到2.23ns。这是一种替代方法,而不是“通常的方法”。例如,在这种情况下,使用信道会造成百分之一的性能损失,3481 ns/op比34.4 ns/op。更新了@peterSO Good point。顺便说一句,tip上的信道速度从2.23ns大幅提高到1.4211ns。