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

如果我使用变量声明 into 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())

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


慕尼黑5688855
浏览 152回答 3
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.Timeif completeTime, err := time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {      return    }fmt.Println(time.Since(completeTime).Seconds())这个有点棘手。您在开始时定义了一个completeTime具有正确范围的 var。然后,由于运算符,您在语句中:=定义了另一个 ,它掩盖了第一个。completeTimeif此外,未使用第二个变量,这就是您收到错误的原因。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())

萧十郎

您需要在 if 之前声明它(如您所见)。您的示例中变量的范围仅限于“if”块。对不起,如果它看起来不好看,但它就是这样。请注意,您的第二个示例需要进行额外更改(请注意 if 行开头的 := 更改):var completeTime time.Timevar err errorif completeTime, err = time.Parse(time.RFC3339Nano, "2016-06-06 18:11:24.617Z"); err != nil {      return}fmt.Println(time.Since(completeTime).Seconds())

扬帆大鱼

正如其他人所说,块内的变量不会提升到块外。else但是您可以在andelse if语句中使用声明的变量。例如(播放中):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())    }}您可以在规范中阅读有关块和范围的更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go