我偶然发现了一个奇怪的问题,以下代码无法编译:
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 https://golang.org/ref/spec#Short_variable_declarations
与常规变量声明不同,短变量声明可以
重新声明变量,前提是它们最初是在
相同的块(或者参数列表,如果该块是函数
body)具有相同的类型,并且至少有一个非空变量
是新的。因此,重新声明只能出现在
多变量简短声明。重新声明不会引入
新变量;它只是为原始值分配一个新值。