Задать вопрос
@duselguy
Пенс

Linter для Go для выявления переменных без явной инициализации?

Не нашёл линтер для Go для выявления переменных без явной инициализации. В чём причина, ведь есть линтеры для выявления неиспользуемых переменных.
P.S. "The variable holds zero-value for the type like zero for the number, false for Booleans, “” for strings, and nil for interface and reference type. So, there is no such concept of an uninitialized variable in Go language." - не ответ.
  • Вопрос задан
  • 256 просмотров
Подписаться 3 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 3
@deliro
Зачем? Ну и если надо, этот "линтер" пишется одной
регуляркой
(\bvar [\s\w._+] [^=].*)|(.*?:= new\(.*)
за две минуты

Но всё равно непонятно — зачем? Есть куча типов, у которых неинициализированное значение — норма. strings.Builder, bytes.Buffer, sync.Mutex, массивы
Ответ написан
@Wirusnyy-chel
Идея для проверки очень хорошая, но, судя по всему, такого литера ещё нет. Если найдёте или сами реализуете, пожалуйста отпишитесь.
Есть близкий по смыслу https://github.com/GaijinEntertainment/go-exhaustruct

Вариант с регулярной может помочь с реализацией необходимого вам поведения с помощью других линтеров.

Идея как это реализовать.
!! Warning похоже на небольшой костыль и сам это поведение не проверял!!
Линтеры:
1. Регулярка из ответа выше.
2. https://github.com/gordonklaus/ineffassign
3. Проверка на использование директивы nolint
Алгоритм:
1. Запрещаете неявную инициализации при помощи регулярки.
2. Если переменная должна быть инициализирована дальше в коде, ineffassing выдаст ошибку, поэтому добавляем директиву nolint. Если этой инициализации не будет (ошибка которую хотим поймать) - упадёт проверка на использование nolint
Ответ написан
@khevse
Частично покрывает ваш кейс для случаев
var x bool
switch y {
case 1:
 x:=true
....
}

print(x)


govet:
  check-shadowing: true
  enabled-all: true
  disable:
  - fieldalignment


источник
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы