语法错误:函数体外的非声明语句

时间:2014-10-10 20:53:05

标签: 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 := makeEvenGenerator()
    fmt.Println(nextEven()) // 0
    fmt.Println(nextEven()) // 2
    fmt.Println(nextEven()) // 4
}  

运行时,我收到错误syntax error: unexpected func, expecting semicolon or newlineNon-declaration statement outside function body

代码是由Caleb Doxsey的 Go in Go Introduction to Go 逐字记录的。我不确定问题是什么。

3 个答案:

答案 0 :(得分:5)

有关于分号的规则。

  

The Go Programming Language Specification

     

Semicolons

     

正式语法使用分号";"作为许多人的终结者   制作。 Go程序可能会使用这些分号省略大多数这些分号   遵循两条规则:

     
      
  1. 当输入被分解为令牌时,如果是分号,则会在非空白行的末尾自动将分号插入到令牌流中   line的最后一个标记是       标识符       整数,浮点,虚数,符文或字符串文字       其中一个关键字是break,continue,fallthrough或return       其中一个运算符和分隔符++, - ,),]或}}
  2.   
  3. 为了允许复杂的语句占用一行,在结束之前可以省略分号")"或"}"。
  4.   

错误在这里,

}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)
    }
}

playground