首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在if语句中不会覆盖Go变量

在if语句中不会覆盖Go变量
EN

Stack Overflow用户
提问于 2014-07-03 23:41:32
回答 3查看 311关注 0票数 2
代码语言:javascript
复制
duration := 1 * time.Hour
if true {
    duration, err := time.ParseDuration("5s")
    _ = duration // if I don't have this, it gives me a duration declared not used error
    if err != nil {
        log.Fatal(err)
    }
}

fmt.Println(duration) // prints 1 hour

我猜这里的问题是持续时间在if语句中再次声明为local var。有没有语法上好的方法来解决这个问题?

EN

回答 3

Stack Overflow用户

发布于 2014-07-03 23:45:00

实际上,您在if块中再次声明了duration变量。我的方法是在if块之前声明err (通常在函数的开头,因为总是需要一个error变量...)。

代码语言:javascript
复制
var err error
duration := 1 * time.Hour
if true {
    duration, err = time.ParseDuration("5s")
    if err != nil {
        log.Fatal(err)
    }
}
票数 9
EN

Stack Overflow用户

发布于 2014-07-03 23:47:35

问题是,您是否希望在time.ParseDuration返回错误时覆盖duration。如果不是,那么我会写

代码语言:javascript
复制
duration := 1 * time.Hour
if true {
    d, err := time.ParseDuration("5s")
    if err != nil {
        log.Fatal(err)
    } else {
        duration = d
    }
}

如果你不关心错误情况下的旧值,@julienc的答案也一样好。

票数 4
EN

Stack Overflow用户

发布于 2014-07-04 21:12:31

Go是一种块结构的编程语言。通常,变量的声明具有最小的作用域。

变量duration在外部(func)作用域中声明和使用,也在内部(if)作用域中设置。在内部(if)作用域中声明并使用err变量。例如,

代码语言:javascript
复制
package main

import (
    "fmt"
    "log"
    "time"
)

func main() {
    duration := 1 * time.Hour
    if true {
        var err error
        duration, err = time.ParseDuration("5s")
        if err != nil {
            log.Fatal(err)
        }
    }
    fmt.Println(duration)
}

输出:

代码语言:javascript
复制
5s

使用简短的变量声明是行不通的。简短的变量声明只能重新声明最初在同一块中声明的变量。

代码语言:javascript
复制
func main() {
    duration := 1 * time.Hour
    if true {
        duration, err := time.ParseDuration("5s")
        if err != nil {
            log.Fatal(err)
        }
    }
    fmt.Println(duration)
}

错误:

代码语言:javascript
复制
duration declared and not used

在外部(func)作用域中声明和使用变量duration。它也在内部(if)作用域中声明(不重新声明)和设置,但不使用。

参考文献:

Block (programming)

Block scope (computer science)

The Go Programming Language Specification

The Go Programming Language Specification: Blocks

The Go Programming Language Specification: Declarations and scope

The Go Programming Language Specification: Short variable declarations

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24558056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档