Затенение переменных



Затенение переменных — одна из частых ошибок в Go, которая может привести к неожиданным последствиям. Пример:

var client *http.Client

if tracing {

client, err := createClientWithTracing()

if err != nil {

return err

}

log.Println(client)

} else {

client, err := createDefaultClient()

if err != nil {

return err

}

log.Println(client)

}




Внутри блоков if и else переменная client заново объявляется с помощью оператора :=, из-за чего внешняя переменная client остаётся неинициализированной. В итоге это приводит к ошибке, ведь внешняя переменная всё ещё равна nil



Как исправить?



1️⃣ Использовать другую переменную во внутренних блоках:

var client *http.Client

if tracing {

c, err := createClientWithTracing()

if err != nil {

return err

}

client = c

} else {

c, err := createDefaultClient()

if err != nil {

return err

}

client = c

}




2️⃣ Или присваивать напрямую:

var client *http.Client

var err error

if tracing {

client, err = createClientWithTracing()

} else {

client, err = createDefaultClient()

}

if err != nil {

return err

}




Затенение переменных в Go может усложнять код и приводить к трудноуловимым багам. Лучше избегать подобных ситуаций, чтобы код был более предсказуемым и легко читаемым 👍



👉 @juniorGolang | #заметки