如何正确初始化一些变量?

时间:2016-06-06 18:37:33

标签: variables go

如果我在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())

为什么以及如何做到这一点?

3 个答案:

答案 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之外指定errif即可解决此问题:

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)

正如其他人所说,块内的变量不会被提升到块的外部。但您可以在elseelse 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中了解有关块和范围的更多信息。