Як відключити невикористану помилку імпорту Golang


96

За замовчуванням Go використовує невикористаний імпорт як помилку, змушуючи вас видалити імпорт. Я хочу знати, чи є якась надія змінити цю поведінку, наприклад, звести її до попередження.

Я вважаю цю проблему надзвичайно дратівливою, заважаючи мені насолоджуватися кодуванням в Go.

Наприклад, я тестував якийсь код, відключаючи сегмент / функцію. Деякі функції з lib більше не використовуються (наприклад, fmt, помилки, що завгодно), але мені потрібно буде знову активувати функцію після невеликого тестування. Тепер програма не буде компілюватися, якщо я не видалю цей імпорт, і через кілька хвилин мені потрібно повторно імпортувати lib.

Я робив цей процес знову і знову, коли розробляв програму GAE.


1
Недоцільно залишати невикористаний імпорт у своєму коді, але ви можете просто прокоментувати їх тимчасово.
елітар

70
Я погоджуюся, що це не дуже гарна ідея залишати невикористаний імпорт, але погана ідея зайвого витрачати зусилля програміста робити такі речі, особливо це трапляється дуже часто при тестуванні чогось. Ті, хто голосує вниз, повинні бути за моє ставлення до ГО з боку тих фанатів Go.
Нік

6
Це особливість, а не помилка .
beatgammit

1
Видалити невикористаний імпорт - це добре. Існує багато посібників зі стилів, які вимагають, щоб усі попередження трактувалися як помилки, тому додавання нового попередження, як правило, є поганою ідеєю. Можливо, прапор -dev може бути можливим компромісом, але він var _ = <module>.Functionпрацює чудово і досить помітно, щоб не допустити, щоб це було звичайною практикою.
deft_code

1
Оскільки хтось зачіпає відповіді нижче, я рекомендую або використовувати IDE, який керує імпортом (Gogland, LiteIDE тощо) - декілька), або goimportsяк крок у вашому процесі збирання. Без жодного з них воно швидко старіє.
Йозеф Гран

Відповіді:


36

Додавання підкреслення ( _) перед назвою пакета ігнорує невикористану помилку імпорту.

Ось приклад того, як ви могли ним користуватися:

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

Щоб імпортувати пакет виключно для його побічних ефектів (ініціалізація), використовуйте порожній ідентифікатор як явну назву пакета.

Детальніше дивіться на https://golang.org/ref/spec#Import_declarations


Це правильна відповідь. На основі Doc специфікації GoLang, він призначений для імпорту пакета виключно для побічних ефектів (ініціалізації). GoLang Spec Doc тут: golang.org/ref/spec#Import_declarations
Буде

Просто фантастично. Це має бути в списку десятки речей, про які повинні знати нові розробники голанг. Дякую!
JM Janzen

9
Не дуже корисно. Проблема з цим полягає в тому, що якщо згодом ви хочете знову скористатися імпортом, ви повинні вилучити _(інакше на пакет не може бути посилання, оскільки він не має назви). Якщо ви збираєтесь це зробити, ви можете просто прокоментувати / коментувати це. У var _ = ...фокусі немає цієї проблеми.
EM0

Якщо ви додасте підкреслення "fmt"в Gogland, він автоматично додає "fmt"так, що у вас є і те, _"fmt"і те "fmt", що робить його марним у цій IDE
kramer65

26

Тут var _ = fmt.Printfпотрібна хитрість.


Я люблю це рішення. Це досить некрасиво, щоб зробити його небажаним, але він працює, тому він є, якщо вам це справді потрібно.
deft_code

3
Для отримання більш детальної інформації перевірте це посилання tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat

3
Це корисно в даний момент, але коли я використовував цю техніку, я прагнув не повертатись та видаляти невикористаний порожній ідентифікатор пізніше, що спричинило імпорт, коли я дійсно не мав намір використовувати їх у довгостроковій перспективі. Використання такого інструменту, як goimports, вирішило справжню проблему і гарантує, що мій імпорт завжди мінімальний і чистий.
mdwhatcott

На мою думку, все-таки дурний хакер, хоча, мабуть, найефективніше.
Антоній

+1, тому що це можна зробити в будь-якому місці файлу , що, як правило, є жахливою ідеєю, але дуже корисно для того, щоб врятувати вас від необхідності стрибати навколо файлу, щоб дістатися до importоператора та назад, коли ви просто намагаєтеся скласти чи тестувати якийсь файл коду, який ви ітераційно розгортаєте.
mtraceur

21

У мене така ж проблема. Я розумію міркування, чому вони реалізували мову, щоб заборонити невикористаний імпорт та змінні, але особисто мені ця функція дратує, коли пишуть свій код. Щоб обійти це, я змінив навколо свого компілятора, щоб дозволити необов'язкові прапори для дозволу невикористаних змінних та імпорту у свій код.

Якщо вас цікавить, ви можете побачити це на https://github.com/dtnewman/modified_golang_compiler .

Тепер я можу просто запустити код з такою командою, як go run -gcflags '-unused_pkgs' test.go, і вона не викине ці помилки "невикористаного імпорту". Якщо я залишю ці прапори, він повернеться до типового режиму, не дозволяючи використовувати невикористаний імпорт.

Для цього потрібно лише кілька простих змін. Пуристики, ймовірно, не будуть задоволені цими змінами, оскільки є вагомі причини не дозволяти невикористаних змінних / імпорту, але я особисто погоджуюся з вами, що це питання робить набагато менш приємним кодувати в Go, тому я вніс ці зміни в свою компілятор.


2
Я також зробив те ж саме з версією 1.6, перевірте тут, якщо зацікавлено: github.com/ronelliott/go/tree/release-branch.go1.6 ПРИМІТКА: деякі тести не вдасться
Ron E

2
Мені подобається ідея, що стоїть за цим. Я бачу, що ви fork все ще є у версії 1.2, що робить його марним. Це повинно бути включено до стандартного компілятора go, принаймні, щоб go run main.goвимкнути помилки за замовчуванням, а go buildввімкнути помилки. Таким чином, це легко розробити за допомогою, go runі коли настав час нарощувати виробництво, ви все одно змушені чистити код.
kramer65

17

Використовуйте гоїмпорт . Це в основному виделка gofmt, написана Бредом Фітцпатріком і тепер включена в пакети інструментів "Go". Ви можете налаштувати свій редактор для запуску кожного разу, коли ви зберігаєте файл. Вам більше ніколи не доведеться турбуватися про цю проблему.


5

Якщо ви використовуєте fmtпакет для загального друку для консолі при розробці та тестуванні, то ви можете знайти краще рішення в пакеті журналу .


5
Або вбудована функція, про printlnяку люди, здається, завжди забувають.
MatrixFrog

2
@MatrixFrog Зрештою, це не дуже гарна ідея будувати ці функції, оскільки вони можуть зникнути з часом. Використання журналу - хороша ідея, оскільки ви можете зберігати їх, і він є частиною стандартної бібліотеки і навряд чи буде видалений. Деталі див. У специфікації .
nemo

1
Вбудований println?? Це для мене новина. Недокументовано? Я не можу його знайти ніде.
Метт

1
@nemo гарний момент. Вони ідеально підходять для того, коли вам потрібно роздрукувати щось як швидке одноразове, але ви не збираєтесь насправді це перевіряти. Напевно, не годиться використовувати їх у будь-якому іншому випадку.
MatrixFrog

1
@MartinTournoij - я не згоден. Це було рішення, яке я врешті знайшов, коли у мене виникло це питання 5 років тому, і 5+ оновлень явно допомогло іншим. Я був новачком, що використовував fmtпакет для ведення журналу, не знаючи, що є готовий пакет журналу.
OldCurmudgeon

5

Використовуйте if false { ... }для коментування якогось коду. Код усередині дужок повинен бути синтаксично правильним, але інакше може бути кодом нісенітниці.


3
Більше ніж синтаксично правильні, будь-які посилаються змінні (наприклад, foo.Bar) повинні існувати тощо.
Dragon

Це не дуже чисто і безглуздо. Є причина, чому Go був розроблений таким, яким він був
Acidic9

1
Це хороша методика, коли можна просто випробовувати речі, розробляючи сценарій або вивчаючи API в Golang. Дякую топікоп!
Джей Тейлор

2

Дуже багато людей вже прокоментували дійсне обґрунтування, і я також визнаю оригінальний задум автора. Однак Роб Пайк на різних форумах згадував, що Go є результатом спрощення процесів, яких не вистачає, або їх нелегко досягти у кількох інших мовах програмування. Це мовна семантика Go, а також для того, щоб зробити компіляцію швидше, прийнято багато речей, які спочатку здаються неефективними.

Щоб скоротити його, невикористаний імпорт вважається помилками Go, оскільки він блокує програму та уповільнює компіляцію. Використання імпорту для побічного ефекту (_) є вирішенням проблеми, однак я вважаю це заплутаним у періоди, коли існує суміш дійсного імпорту з побічними ефектами, а також побічні ефекти, імпортовані виключно з метою налагодження / тестування, особливо коли база коду є великий і є шанс забути і не видалити ненавмисне, що може заплутати інших інженерів / рецензентів пізніше. Я коментував невикористані, проте популярні IDE, такі як код VS та Goland, можуть goimportsлегко використовувати, що робить вставку та видалення імпорту досить добре. Для отримання додаткової інформації перейдіть за посиланням https://golang.org/doc/effective_go.html#blank_import


Дякую за це! Я б запропонував явно скопіювати вставку рядка коду з URL-адреси, яку ви опублікували у своїй відповіді, як конкретний приклад імпортування побічних ефектів: import _ "net/http/pprof"
Dragon,

1
Дякуємо @Dragon за вашу пропозицію! Оскільки я є новим дописувачем, за допомогою таких людей, як ви, швидко покращуся свої публікації.
sbcharr

-1

помістіть це вгорі свого документа і забудьте про невикористаний імпорт:

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs

1
Замість того, щоб компілятор генерував мертвий код, якщо ви дійсно хотіли це зробити, використовуйте _натомість глобальні змінні (наприклад, один пакет на рядок або якщо ви наполягаєте, все разом, як var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs:). Але не робіть цього, просто використовуйте goimports.
Дейв C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.