Как избежать раздражающей ошибки, объявленной и не использованной, из Golang
Я изучаю Golang, но я чувствую, что это немного раздражает, что при компиляции я не должен оставлять какую-либо переменную или пакет неиспользованными.
Это действительно замедляет меня. Например, я просто хотел объявить новый пакет и планирую использовать его позже или просто раскомментировать некоторую команду для тестирования. Я всегда получаю сообщение об ошибке и должен прокомментировать все эти действия.
Есть ли способ избежать подобной проверки в Голанге?
Ответы
Ответ 1
Эта ошибка здесь, чтобы заставить вас писать лучший код и не забудьте использовать все, что вы объявляете или импортируете. Это упрощает чтение кода, написанного другими людьми (вы всегда уверены, что все объявленные переменные будут использоваться) и избегать возможного мертвого кода.
Но если вы действительно хотите пропустить эту ошибку, вы можете использовать пустой идентификатор (_
):
package main
import (
"fmt" // imported and not used: "fmt"
)
func main() {
i := 1 // i declared and not used
}
становится
package main
import (
_ "fmt" // no more error
)
func main() {
i := 1 // no more error
_ = i
}
Как сказано kostix в комментариях ниже, вы можете найти официальную позицию команды Go в FAQ: "Наличие неиспользуемая переменная может указывать на ошибку, в то время как неиспользуемые импорты просто замедляют компиляцию. Накопите достаточное количество неиспользуемых импортов в вашем кодовом дереве, и все может стать очень медленным. По этим причинам Go не позволяет ни".
Ответ 2
В соответствии с ЧаВо:
Некоторые попросили параметр компилятора отключить эти проверки или, по крайней мере, уменьшить их до предупреждений. Однако такой вариант не был добавлен, поскольку параметры компилятора не должны влиять на семантику языка и потому, что компилятор Go не сообщает о предупреждениях, только ошибки, которые предотвращают компиляцию.
Есть две причины отсутствия предупреждений. Во-первых, если это стоит жаловаться, стоит закрепить код. (И если это не стоит исправлять, это не стоит упоминать.) Во-вторых, наличие компилятора генерирует предупреждения, побуждает реализацию предупреждать о слабых случаях, которые могут сделать компиляцию шумной, маскируя реальные ошибки, которые должны быть исправлены.
Я не обязательно соглашаюсь с этим по различным причинам, в которые не стоит входить. Это то, что есть, и вряд ли это изменится в ближайшем будущем.
Для пакетов есть инструмент goimports
, который автоматически добавляет недостающие пакеты и удаляет неиспользуемые. Например:
# Install it
$ go get golang.org/x/tools/cmd/goimports
# -w to write the source file instead of stdout
$ goimports -w my_file.go
Вы должны иметь возможность запускать это из любого подходящего редактора на полпути - например, для Vim:
:!goimports -w %
На странице goimports
перечислены некоторые команды для других редакторов, и вы обычно устанавливаете ее автоматически, когда вы сохраняете буфер на диск.
Обратите внимание, что goimports
также будет запускать gofmt
.
Как уже упоминалось, для переменных проще всего (временно) назначить их _
:
// No errors
your_mother := "was a hamster"
your_father := "smells of elderberries"
// Commented out for debugging
//insult(your_mother, your_father)
_, _ = your_mother, your_father
Ответ 3
Для этого можно использовать простую "нулевую функцию", например:
func Use(vals ...interface{}) {
for _, val := range vals {
_ = val
}
}
Что вы можете использовать так:
package main
func main() {
a := "declared and not used"
b := "another declared and not used"
c := 123
Use(a, b, c)
}
Там также пакет для этого, поэтому вам не нужно каждый раз определять функцию Use
:
import (
"github.com/lunux2008/xulu"
)
func main() {
// [..]
xulu.Use(a, b, c)
}
Ответ 4
Один угол, о котором не упоминалось выше, - это наборы инструментов, используемые для редактирования кода.
Используя Код Visual Studio вместе с Расширением от lukehoban, называемым Go
, сделают для вас некоторую автоматическую магию. Расширение Go автоматически запускает gofmt
, golint
и т.д., А также удаляет и добавляет записи import
. Итак, по крайней мере, эта часть теперь автоматическая.
Я признаю его не 100% решения вопроса, но как бы он ни был полезен.