For loop 循环中打开大括号的语法规则 案例1

For loop 循环中打开大括号的语法规则 案例1,for-loop,go,syntax,curly-braces,For Loop,Go,Syntax,Curly Braces,此程序成功编译: package main import ( "fmt" ) func main() { i := 0 for { fmt.Println(i) } } 主程序包 进口( “fmt” ) func main(){ i:=0 对于;i

此程序成功编译:

package main

import (
    "fmt"
)

func main() {
    i := 0
    for
    {
        fmt.Println(i)
    }
}
主程序包
进口(
“fmt”
)
func main(){
i:=0
对于;i<3;i++{
fmt.Println(一)
}
}
案例2 但这并不是:

主程序包
进口(
“fmt”
)
func main(){
i:=0
因为;我<3;我++
{
fmt.Println(一)
}
}
这会导致错误:

./prog.go:9:18: syntax error: unexpected newline, expecting { after for clause
案例3 但这成功地编译了:

package main

import (
    "fmt"
)

func main() {
    i := 0
    for
    {
        fmt.Println(i)
    }
}
问题:
为什么在案例2中,下一行中不允许使用的开头大括号,但在案例3中允许使用?

简而言之,当您将此列在一行中时:

for ; i < 3; i++
for;i<3;我++
分号将自动插入,导致语法错误

当输入被分解为令牌时,分号会自动插入到令牌流中,紧跟在行的最终令牌之后(如果该令牌是

  • 一个
  • 、或文字
  • 中断
    继续
    故障排除
    ,或
    返回
  • 其中一个
    ++
    --
    ]
    }
因此,在情况2中,lexer将自动在行尾插入分号,当分号出现时,将“呈现”语法错误的代码

不在情况3中当一行中只有一个
for
时,不插入分号(根据上面引用的规则,分号仅在
中断
继续
故障排除
返回
关键字后插入)。因此,在情况3中,代码不会用分号进行扩展,并且在语法上保持正确

有关更多详细信息,请参阅主程序包 进口( “fmt” ) func main(){ i:=0 因为;我<3;我++{ fmt.Println(一) } } 只不过将
{
放入新行会导致出现错误


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

最后一行可能不被允许,它可能是一个bug,但从我对规范的阅读来看,这不是100%清楚的,为什么会出现否决票?我如何才能更好地回答这个问题?