Неопределенная переменная err

go

3714 просмотра

1 ответ

Как Go "newb" я не уверен, почему я получаю ошибки undefined err и undefinded user в консоли при компиляции программы.

У меня есть:

if req.Id == nil {
    user, err := signup(C, c, &req)
} else {
    user, err := update(C, c, &req)
}

if err != nil {
    c.JSON(http.StatusOK, err)
    return
}

doSomethingWith(user)

Я понимаю , что я мог бы объявить errи userпеременные до условного блока , но я хотел бы знать , почему это не работает. Это как-то связано с созданием двух новых переменных за один раз?

UDPATE С этим немного путаюсь .

Теперь у меня есть:

user := core.User{}
if req.Id == nil {
    user, err := signup(C, c, &req)
} else {
    user, err := update(C, c, &req)
}

cleanUser(&user)

и мои ошибки теперь объявлены пользователем и не используются . Я не занимаюсь ошибкой в данный момент, но я не уверен, почему я получаю ошибки о пользователе.

Автор: tommyd456 Источник Размещён: 12.11.2019 09:14

Ответы (1)


10 плюса

Решение

Это потому, что область действия errпеременной, которую вы создаете: она находится только в области видимости (и, следовательно, действительной / ссылочной) до конца самого внутреннего блока, в котором вы ее объявили.

Spec: объявления и область применения

Область действия идентификатора константы или переменной, объявленного внутри функции, начинается в конце ConstSpec или VarSpec (ShortVarDecl для коротких объявлений переменных) и заканчивается в конце самого внутреннего содержащего блока .

Когда вы объявляете его перед ifоператором, он будет находиться в области видимости до конца блока контейнера, который также включает в себя 2-й, ifгде вы проверяете errпеременную, так что это нормально.

UDPATE:

Обновление до вашего обновления: вы использовали краткое объявление переменной, которое создает новые переменные, потому что вы использовали его в новом блоке. Вы не использовали эти новые переменные (только «другие», userобъявленные вне внутреннего блока), следовательно, ошибка времени компиляции « пользователь объявлен и не используется» .

Решение простое: просто объявите обе переменные перед ifи не используйте краткое объявление переменной, а просто присваивание :

user := core.User{}
var err error

if req.Id == nil {
    user, err = signup(C, c, &req)
} else {
    user, err = update(C, c, &req)
}

if err == nil {
    cleanUser(&user)
}

Или используя одну строку для объявления userи err:

user, err := core.User{}, error(nil)
Автор: icza Размещён: 17.09.2015 10:55
Вопросы из категории :
32x32