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。有没有语法上好的方法来解决这个问题?
发布于 2014-07-03 23:45:00
实际上,您在if块中再次声明了duration变量。我的方法是在if块之前声明err (通常在函数的开头,因为总是需要一个error变量...)。
var err error
duration := 1 * time.Hour
if true {
duration, err = time.ParseDuration("5s")
if err != nil {
log.Fatal(err)
}
}发布于 2014-07-03 23:47:35
问题是,您是否希望在time.ParseDuration返回错误时覆盖duration。如果不是,那么我会写
duration := 1 * time.Hour
if true {
d, err := time.ParseDuration("5s")
if err != nil {
log.Fatal(err)
} else {
duration = d
}
}如果你不关心错误情况下的旧值,@julienc的答案也一样好。
发布于 2014-07-04 21:12:31
Go是一种块结构的编程语言。通常,变量的声明具有最小的作用域。
变量duration在外部(func)作用域中声明和使用,也在内部(if)作用域中设置。在内部(if)作用域中声明并使用err变量。例如,
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)
}输出:
5s使用简短的变量声明是行不通的。简短的变量声明只能重新声明最初在同一块中声明的变量。
func main() {
duration := 1 * time.Hour
if true {
duration, err := time.ParseDuration("5s")
if err != nil {
log.Fatal(err)
}
}
fmt.Println(duration)
}错误:
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
https://stackoverflow.com/questions/24558056
复制相似问题