недавно объявлен.

кнулся на странную проблему, из-за которой приведенный ниже код не компилируется:

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

В отличие от обычных объявлений переменных, краткое объявление переменных может переопределять переменные при условии, что они были первоначально объявлены ранее в том же блоке (или списках параметров, если блок является телом функции) с тем же типом и, по крайней мере, одной из непустых переменных новый. Как следствие, объявление может появиться только в кратком объявлении с несколькими переменными. Переопределение не вводит новую переменную; он просто присваивает новое значение оригиналу.

Ответы на вопрос(2)

Ваш ответ на вопрос