По умолчанию Go рассматривает неиспользованный импорт как ошибку, вынуждая вас удалить импорт. Я хочу знать, есть ли надежда изменить это поведение, например, превратить его в предупреждение.
Я нахожу эту проблему очень раздражающей, потому что мне не нравится писать на Go.
Например, я тестировал какой-то код, отключая сегмент / функцию. Некоторые функции из библиотеки больше не используются (например, fmt, errors, что угодно), но мне нужно будет снова включить функцию после небольшого тестирования. Теперь программа не будет компилироваться, если я не удалю этот импорт, а через несколько минут мне нужно повторно импортировать библиотеку.
Я повторял этот процесс снова и снова при разработке программы GAE.
var _ = <module>.Function
работает нормально и достаточно бросается в глаза, чтобы предотвратить его распространение.goimports
в качестве шага в процессе сборки. Без любого из них он очень быстро стареет.Ответы:
Добавление символа подчеркивания (
_
) перед именем пакета игнорирует неиспользуемую ошибку импорта.Вот пример того, как вы могли бы это использовать:
import ( "log" "database/sql" _ "github.com/go-sql-driver/mysql" )
См. Больше на https://golang.org/ref/spec#Import_declarations
источник
_
(в противном случае на пакет нельзя будет ссылаться, так как у него нет имени). Если вы собираетесь это сделать, вы можете просто прокомментировать / раскомментировать это. Уvar _ = ...
трюка нет этой проблемы."fmt"
в Gogland, он автоматически добавится,"fmt"
так что у вас есть оба_"fmt"
и"fmt"
, что делает его бесполезным в этой среде IDEvar _ = fmt.Printf
Трюк полезно здесь.источник
import
оператора и обратно, когда вы просто пытаетесь скомпилировать или протестировать какой-нибудь файл кода, который вы итеративно дополняете.У меня такая же проблема. Я понимаю причину, по которой они реализовали язык, чтобы запретить неиспользуемый импорт и переменные, но лично меня эта функция раздражает при написании кода. Чтобы обойти это, я изменил свой компилятор, чтобы разрешить дополнительные флаги для разрешения неиспользуемых переменных и импорта в моем коде.
Если вам интересно, вы можете увидеть это на https://github.com/dtnewman/modified_golang_compiler .
Теперь я могу просто запустить код с помощью такой команды, как go run -gcflags '-unused_pkgs' test.go, и она не выдаст эти ошибки «неиспользованного импорта». Если я опущу эти флаги, он вернется к значению по умолчанию, запрещающему неиспользуемый импорт.
Для этого потребовалось всего несколько простых изменений. Пуристы Go, вероятно, не будут довольны этими изменениями, поскольку есть веская причина не разрешать неиспользуемые переменные / импорт, но я лично согласен с вами, что эта проблема делает код на Go гораздо менее приятным, поэтому я внес эти изменения в свой компилятор.
источник
go run main.go
отключить ошибки по умолчанию, ноgo build
разрешить ошибки. Таким образом, легко разрабатывать с использованием,go run
и когда пришло время создавать для производства, вы все равно вынуждены очищать свой код.Используйте goimports . По сути, это форк
gofmt
, написанный Брэдом Фитцпатриком и теперь включенный в пакеты инструментов go. Вы можете настроить свой редактор так, чтобы он запускался всякий раз, когда вы сохраняете файл. Вам больше никогда не придется беспокоиться об этой проблеме.источник
Если вы используете
fmt
пакет для общей печати на консоли во время разработки и тестирования, вы можете найти лучшее решение в пакете журнала .источник
println
которой люди, кажется, всегда забывают.println
?? Это для меня новость. Это недокументировано? Нигде не могу найти.fmt
пакет для ведения журнала, не подозревая, что существует готовый пакет для ведения журнала.Используйте,
if false { ... }
чтобы закомментировать код. Код внутри фигурных скобок должен быть синтаксически правильным, но в противном случае может быть бессмысленным кодом.источник
Многие люди уже дали обоснованные комментарии, и я также подтверждаю намерение первоначального автора. Однако Роб Пайк упоминал на разных форумах, что Go - это результат упрощения процессов, который в некоторых других основных языках программирования либо отсутствует, либо нелегко реализовать. Это семантика языка Go, а также для ускорения компиляции есть много вещей, которые изначально кажутся неэффективными.
Короче говоря, неиспользуемый импорт считается ошибкой в Go, поскольку он загрязняет программу и замедляет компиляцию. Использование импорта для побочного эффекта (_) - это обходной путь, однако я нахожу это иногда сбивающим с толку, когда есть сочетание действительного импорта с побочными эффектами вместе с побочными эффектами, импортированными исключительно с целью отладки / тестирования, особенно когда база кода большой, и есть шанс забыть и не удалить случайно, что может запутать других инженеров / рецензентов позже. Раньше я закомментировал неиспользуемые, однако популярные IDE, такие как VS code и Goland, можно
goimports
легко использовать, что делает вставку и удаление импорта довольно хорошо. Для получения дополнительной информации перейдите по ссылке https://golang.org/doc/effective_go.html#blank_import.источник
import _ "net/http/pprof"
поместите это поверх документа и забудьте о неиспользуемом импорте:
import ( "bufio" "fmt" "os" "path/filepath" ) var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
источник
_
вместо этого глобальные переменные (например, один пакет на строку или, если вы настаиваете, все вместе, например:)var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
. Но не делайте этого, просто используйтеgoimports
.