【发布时间】:2018-09-11 18:04:40
【问题描述】:
我偶然发现了一个奇怪的问题,即下面的代码无法编译:
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
与常规变量声明不同,短变量声明可以 重新声明变量,前提是它们最初是在 相同的块(如果块是函数,则为参数列表 body) 具有相同的类型,并且至少有一个非空白变量 是新的。因此,重新声明只能出现在 多变量短声明。重新声明并未引入 新变量;它只是为原始值分配一个新值。
【问题讨论】:
-
谁投了反对票——你能详细说明为什么吗?启发我
-
WRT 来自 GO 文档的引用:这里的关键关键字是“相同的块”。
if打开一个新的嵌套块,因此这不适用(请参阅我的答案以获得更详细的解释)。
标签: go