为什么在 if 条件中添加括号会导致编译错误?

以下 Go 代码运行正常:


package main


import "fmt"


func main() {

    if j := 9; j > 0 {

        fmt.Println(j)

    }

}

但是在条件中添加括号后:


package main


import "fmt"


func main() {

    if (j := 9; j > 0) {

        fmt.Println(j)

    }

}

有编译错误:


.\Hello.go:7: syntax error: unexpected :=, expecting )

.\Hello.go:11: syntax error: unexpected }

为什么编译器会抱怨它?


MM们
浏览 310回答 2
2回答

互换的青春

答案不仅仅是“因为 Go 不需要括号”;看到以下示例是有效的 Go 语法:j := 9if (j > 0) {    fmt.Println(j)}Go Spec: If 语句:IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] .我的示例与您的示例之间的区别在于,我的示例仅包含 Expression 块。表达式可以根据需要用括号括起来(它的格式不会很好,但这是另一个问题)。在您的示例中,您同时指定了 Simple 语句和 Expression 块。如果将整体放入括号中,编译器将尝试将整体解释为this 不符合条件的表达式块:Expression = UnaryExpr | Expression binary_op UnaryExpr .j > 0是一个有效的表达式,j := 9; j > 0不是一个有效的表达式。即使j := 9它本身不是一个表达式,它也是一个Short 变量声明。此外,简单的赋值(例如j = 9)不是 Go 中的表达式,而是语句(Spec: Assignments)。请注意,赋值通常是其他语言(如 C、Java 等)中的表达式)。这就是为什么例如以下代码也无效的原因:x := 3y := (x = 4)

繁星coding

因为那是围棋语法如何定义的if声明。IfStmt = "if" [ SimpleStmt ";" ] 表达式块 [ "else" ( IfStmt | Block ) ] 。来自Effective Go:括弧Go 需要的括号比 C 和 Java 少:控制结构(if、for、switch)的语法中没有括号。和:控制结构Go 的控制结构与 C 的控制结构相关,但在重要方面有所不同。没有 do 或 while 循环,只有一个稍微概括的 for;切换更灵活;if 和 switch 接受一个可选的初始化语句,比如 for ;break 和 continue 语句采用可选标签来标识要中断或继续的内容;并且有新的控制结构,包括类型开关和多路通信多路复用器,选择。语法也略有不同:没有括号,主体必须始终以大括号分隔。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go