我偶然发现了一个奇怪的问题,下面的代码无法编译:
func main() {
var val reflect.Value
var tm time.Time
if tm, err := time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil {
panic(err)
}
val = reflect.ValueOf(tm)
fmt.Println(val, tm, reflect.TypeOf(tm))
}
出现错误(代码是 linter 推荐的代码):
$ go run main.go
# command-line-arguments
./main.go:13:5: tm declared and not used
注意tm变量确实被使用了。
但是,如果我添加一个 else 块 - 一切都按预期编译:
func main() {
var val reflect.Value
var tm time.Time
if tm, err := time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil {
panic(err)
} else {
val = reflect.ValueOf(tm)
}
fmt.Println(val, tm, reflect.TypeOf(tm))
}
这看起来像是编译器中的错误或者可能是已知问题?任何想法?(我正在使用 go 1.11)
编辑:到目前为止所有的回应者。根据:https: //golang.org/ref/spec#Short_variable_declarations
与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块(如果块是函数体,则为参数列表)中较早声明的,具有相同的类型,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新变量;它只是为原始值分配了一个新值。
杨魅力
温温酱
相关分类