Go for 循环中左大括号的语法规则

Syntax rule for opening brace in Go for-loop

案例一

此程序编译成功:

package main

import (
    "fmt"
)

func main() {
    i := 0
    for ; i < 3; i++ {
        fmt.Println(i)
    }
}

案例二

但这不是:

package main

import (
    "fmt"
)

func main() {
    i := 0
    for ; i < 3; i++
    {
        fmt.Println(i)
    }
}

这会导致错误:

./prog.go:9:18: syntax error: unexpected newline, expecting { after for clause

案例三

但是编译成功:

package main

import (
    "fmt"
)

func main() {
    i := 0
    for
    {
        fmt.Println(i)
    }
}

问题

为什么在情况 2 中下一行不允许 for 的左大括号,但在情况 3 中允许?

简而言之,当你符合以下条件时:

for ; i < 3; i++

会自动插入分号,导致语法错误。

Spec: Semicolons:

When the input is broken into tokens, a semicolon is automatically inserted into the token stream immediately after a line's final token if that token is

所以在情况 2 中,词法分析器会自动在行尾插入一个分号,如果出现分号,代码将“呈现”语法错误。

不在情况3当一行中只有一个for时,不插入分号(按照上面引用的规则,只在后面插入分号breakcontinuefallthroughreturn 关键字)。所以在案例 3 中,代码不会用分号扩展,并且在语法上保持正确。

有关详细信息,请参阅

package main

import (
    "fmt"
)

func main() {
    i := 0
    for ; i < 3; i++{
        fmt.Println(i)
    }
}

只是将 { 换行会导致出现错误。

在情况 3 中,您没有任何要评估的语句,因此换行不会导致 y 问题。