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。