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

时间:2015-06-19 03:29:28

标签: syntax go syntax-error

以下Go代码运行正常:

NAN_METHOD(MQ_Connect) {
  NanScope();

  if (args.Length() > 0) {
    if (args[0]->IsString()) {
      String::Utf8Value str(args[0]->ToString());
      printf("(cc)>>>> qmn [%s].\n", (const char*)(*str));
    }
  }

但在条件中添加括号后

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)
    }
}

为什么编译器会抱怨它?

2 个答案:

答案 0 :(得分:5)

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

j := 9
if (j > 0) {
    fmt.Println(j)
}

Go Spec: If statements:

IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] .

我的示例与您的示例之间的区别在于我的示例仅包含Expression块。表达式可以根据需要加括号(它格式不正确,但这是另一个问题)。

在您的示例中,您同时指定了Simple语句和Expression块。如果将整体放入括号中,编译器将尝试将整体解释为Expression Block to which this does not qualify

Expression = UnaryExpr | Expression binary_op UnaryExpr .

j > 0是一个有效的表达式,j := 9; j > 0不是有效的表达式。

即使j := 9本身不是表达式,也是Short variable declaration。此外,简单赋值(例如j = 9)不是Go中的表达式,而是语句(Spec: Assignments)。请注意,赋值通常是其他语言(如C,Java等)的表达式。这就是为什么例如以下代码也无效的原因:

x := 3
y := (x = 4)

答案 1 :(得分:0)

因为这就是Go语法definesif语句的方式。

  

IfStmt =" if" [SimpleStmt&#34 ;;" ]表达块["否则" (IfStmt |   Block)]。

来自Effective Go

  

圆括号

     

Go比C和Java需要更少的括号:控制   结构(if,for,switch)的语法中没有括号。

and

  

控制结构

     

Go的控制结构与C的控制结构有关但不同   重要的方式。没有do或while循环,只有一点点   广义的;开关更灵活; if和switch接受   可选的初始化语句,如for;休息并继续   语句采用可选标签来标识要破坏的内容或   继续;并且有新的控制结构,包括一个类型开关   和多路通信多路复用器,选择。 语法也是   略有不同:没有括号,身体必须   永远是大括号。

(强调补充)