以下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)
}
}
为什么编译器会抱怨它?
答案 0 :(得分:5)
答案不仅仅是“因为Go不需要括号”;看到以下示例是有效的Go语法:
j := 9
if (j > 0) {
fmt.Println(j)
}
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语法defines和if
语句的方式。
IfStmt =" if" [SimpleStmt&#34 ;;" ]表达块["否则" (IfStmt | Block)]。
来自Effective Go:
圆括号
Go比C和Java需要更少的括号:控制 结构(if,for,switch)的语法中没有括号。
and:
控制结构
Go的控制结构与C的控制结构有关但不同 重要的方式。没有do或while循环,只有一点点 广义的;开关更灵活; if和switch接受 可选的初始化语句,如for;休息并继续 语句采用可选标签来标识要破坏的内容或 继续;并且有新的控制结构,包括一个类型开关 和多路通信多路复用器,选择。 语法也是 略有不同:没有括号,身体必须 永远是大括号。
(强调补充)