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)
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 语句采用可选标签来标识要中断或继续的内容;并且有新的控制结构,包括类型开关和多路通信多路复用器,选择。语法也略有不同:没有括号,主体必须始终以大括号分隔。
- 2 回答
- 0 关注
- 309 浏览
添加回答
举报