为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MM们 2021-10-18 11:05:40
以下 Go 代码运行正常:package mainimport "fmt"func main() {    if j := 9; j > 0 {        fmt.Println(j)    }}但是在条件中添加括号后:package mainimport "fmt"func main() {    if (j := 9; j > 0) {        fmt.Println(j)    }}有编译错误:.\Hello.go:7: syntax error: unexpected :=, expecting ).\Hello.go:11: syntax error: unexpected }为什么编译器会抱怨它?
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

答案不仅仅是“因为 Go 不需要括号”;看到以下示例是有效的 Go 语法:


j := 9

if (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 := 3

y := (x = 4)


查看完整回答
反对 回复 2021-10-18
?
繁星coding

TA贡献1797条经验 获得超4个赞

因为那是围棋语法如何定义的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 语句采用可选标签来标识要中断或继续的内容;并且有新的控制结构,包括类型开关和多路通信多路复用器,选择。语法也略有不同:没有括号,主体必须始终以大括号分隔。


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 309 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信