英文:
Why doesn't this check for nil in go work?
问题
在第一个代码示例中,我在“if pr != nil”这一行遇到了错误:
for sup, _ := range supervisorToColor {
pr := emailToPerson[sup]
// 下面这行代码导致了编译错误:
// ./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检查的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,其中Person是一个结构体。
提前感谢您的帮助。如果这个问题最终变得非常简单,请原谅。
英文:
In the first code example, I get errors for the "if pr != nil" line:
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)
}
}
If I comment out the nil check if statement, it compiles fine:
for sup, _ := range supervisorToColor {
pr := emailToPerson[sup]
// if pr != nil
// {
local := peopleOnFloor[pr.Email]
sp := &Super{pr, local}
names = append(names, sp)
// }
}
At first I was inclined to think it was some syntax error earlier in the code, but the fact that it works when I comment out the lines makes me think it's something else.
emailToPerson is of type map[string]*Person where Person is a struct
Thanks in advance. Apologies if this turns out to be something incredibly simple.
答案1
得分: 6
开放的大括号需要与if
在同一行上:
if pr != nil {
根据Go规范中的分号:
> 正式的语法在许多产生式中使用分号“;”作为终止符号。Go程序可以使用以下两个规则省略大部分分号:
> 1. 当输入被分解为标记时,如果该行的最后一个标记是
> - 标识符
- 整数、浮点数、虚数、符文或字符串字面量
- 关键字
break
、continue
、fallthrough
或return
- 运算符和分隔符
++
、--
、)
、]
或}
则会自动在标记流中的该标记之后插入一个分号。
> 2. 为了允许复杂语句占据一行,可以在闭合的“)”或“}`”之前省略分号。
这意味着你的代码等价于:
if pr != nil;
{
// ...
}
英文:
The open curly brace needs to be on the same line as the if
:
if pr != nil {
From the Go spec on semicolons:
> The formal grammar uses semicolons ";" as terminators in a number of productions. Go programs may omit most of these semicolons using the following two rules:
> 1. When the input is broken into tokens, a semicolon is automatically inserted into the token stream immediately after a line's final token if that token is
> - an identifier
- an integer, floating-point, imaginary, rune, or string literal
- one of the keywords
break
,continue
,fallthrough
, orreturn
- one of the operators and delimiters
++
,--
,)
,]
, or}
> 2. To allow complex statements to occupy a single line, a semicolon may be omitted before a closing ")
" or "}
".
This means that your code was equivalent to:
if pr != nil;
{
// ...
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论