为什么不检查nil上班?

时间:2015-09-21 18:37:29

标签: go

在第一个代码示例中,我收到“if pr!= nil”行的错误:

for sup, _ := range supervisorToColor {
        pr := emailToPerson[sup]
        // The line below causes the compilation error:
        // ./myprog.go:1046: missing condition in if statement
        // ./myprog.go:1046: pr != nil evaluated but not used
        if pr != nil 
        {   
          local := peopleOnFloor[pr.Email]
          sp := &Super{pr, local}
          names = append(names, sp) 
        }   
}   

如果我注释掉nil check if语句,它编译得很好:

for sup, _ := range supervisorToColor {
        pr := emailToPerson[sup]
        // if pr != nil 
        // {
          local := peopleOnFloor[pr.Email]
          sp := &Super{pr, local}
          names = append(names, sp) 
        // }
}   

起初我倾向于认为这是代码中较早出现的一些语法错误,但是当我注释掉这些行时它会起作用的事实让我认为它是另一回事。

emailToPerson的类型为map [string] * Person是struct的人

提前致谢。如果事实证明这非常简单,那就道歉了。

1 个答案:

答案 0 :(得分:6)

开放花括号需要与if

位于同一行
if pr != nil { 

来自Go spec on semicolons

  

正式语法使用分号“;”作为许多作品的终结者。 Go程序可以使用以下两个规则省略大多数这些分号:

     
      
  1. 当输入被分解为令牌时,如果该令牌是

    ,则在行的最终令牌之后立即自动将分号插入到令牌流中      
        
    • 标识符
    •   
    • 整数,浮点,虚数,符文或字符串文字
    •   
    • 其中一个关键字breakcontinuefallthroughreturn
    •   
    • 其中一个运算符和分隔符++--)]}
    •   
  2.   
  3. 要允许复杂语句占用一行,在结束“)”或“}”之前可以省略分号。

  4.   

这意味着您的代码相当于:

if pr != nil;
{
    // ...
}