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++
会自动插入分号,导致语法错误。
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
- an identifier
- an integer, floating-point, imaginary, rune, or string literal
- one of the keywords
break
, continue
, fallthrough
, or return
- one of the operators and punctuation
++
, --
, )
, ]
, or }
所以在情况 2 中,词法分析器会自动在行尾插入一个分号,如果出现分号,代码将“呈现”语法错误。
不在情况3当一行中只有一个for
时,不插入分号(按照上面引用的规则,只在后面插入分号break
、continue
、fallthrough
和 return
关键字)。所以在案例 3 中,代码不会用分号扩展,并且在语法上保持正确。
有关详细信息,请参阅
package main
import (
"fmt"
)
func main() {
i := 0
for ; i < 3; i++{
fmt.Println(i)
}
}
只是将 {
换行会导致出现错误。
在情况 3 中,您没有任何要评估的语句,因此换行不会导致 y 问题。
案例一
此程序编译成功:
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++
会自动插入分号,导致语法错误。
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
- an identifier
- an integer, floating-point, imaginary, rune, or string literal
- one of the keywords
break
,continue
,fallthrough
, orreturn
- one of the operators and punctuation
++
,--
,)
,]
, or}
所以在情况 2 中,词法分析器会自动在行尾插入一个分号,如果出现分号,代码将“呈现”语法错误。
不在情况3当一行中只有一个for
时,不插入分号(按照上面引用的规则,只在后面插入分号break
、continue
、fallthrough
和 return
关键字)。所以在案例 3 中,代码不会用分号扩展,并且在语法上保持正确。
有关详细信息,请参阅
package main
import (
"fmt"
)
func main() {
i := 0
for ; i < 3; i++{
fmt.Println(i)
}
}
只是将 {
换行会导致出现错误。
在情况 3 中,您没有任何要评估的语句,因此换行不会导致 y 问题。