недавно объявлен.
кнулся на странную проблему, из-за которой приведенный ниже код не компилируется:
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))
}
с ошибкой (код - это то, что рекомендует линтер).
$ 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
В отличие от обычных объявлений переменных, краткое объявление переменных может переопределять переменные при условии, что они были первоначально объявлены ранее в том же блоке (или списках параметров, если блок является телом функции) с тем же типом и, по крайней мере, одной из непустых переменных новый. Как следствие, объявление может появиться только в кратком объявлении с несколькими переменными. Переопределение не вводит новую переменную; он просто присваивает новое значение оригиналу.