如果我在if
中使用变量声明,则会收到错误undefined: completeTime
if completeTime, err := time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {
return
}
fmt.Println(time.Since(completeTime).Seconds())
但如果我声明,我收到错误completeTime declared and not used
var completeTime time.Time
if completeTime, err := time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {
return
}
fmt.Println(time.Since(completeTime).Seconds())
为什么以及如何做到这一点?
答案 0 :(得分:3)
您的代码中存在范围问题:
if completeTime, err := time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {
return
}
fmt.Println(time.Since(completeTime).Seconds())
在此示例中,completeTime
仅针对if
语句中的本地范围定义,这意味着您无法在其外部使用它。
var completeTime time.Time
if completeTime, err := time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {
return
}
fmt.Println(time.Since(completeTime).Seconds())
这个有点棘手。您可以在开头定义具有正确范围的completeTime
var。然后,由于:=
运算符,您在completeTime
语句中定义了另一个 if
,这掩盖了第一个语句。
此外,未使用此第二个变量,这就是您收到错误的原因。您只需在completeTime
之外指定err
和if
即可解决此问题:
completeTime, err := time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z")
if err != nil {
return
}
fmt.Println(time.Since(completeTime).Seconds())
答案 1 :(得分:2)
你需要在if之前声明它(如你所知)。示例中变量的范围仅限于“if”块。对不起,如果它不好看,但它是怎么回事。请注意您的第二个示例需要进行其他更改(请注意:在if行开头的=:=
)var completeTime time.Time
var err error
if completeTime, err = time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {
return
}
fmt.Println(time.Since(completeTime).Seconds())
答案 2 :(得分:1)
正如其他人所说,块内的变量不会被提升到块的外部。但您可以在else
和else if
语句中使用声明的变量。
例如(on play):
func main() {
if completeTime, err := time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {
fmt.Println(err)
} else {
fmt.Println(time.Since(completeTime).Seconds())
}
}
您可以在specification中了解有关块和范围的更多信息。