Як уникнути набридливої ​​помилки, "заявленої та не використовується"


238

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

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

Чи є якийсь спосіб уникнути такого виду перевірки в Go?


1
Ви також можете використовувати goimports ( godoc.org/code.google.com/p/go.tools/cmd/goimports ) для автоматичного додавання / видалення імпорту для вас.
елітар


3
Я все ще вважаю, що варіант компілятора буде корисним для робочого процесу "Я хочу прокоментувати щось для полегшення налагодження".
RJFalconer

13
Ця особливість є чудовим способом витрачати час на лю-ха, в чому сенс? Коли ви вводите / кодовий код, добре, немає невикористаних вар, це добре, але коли ви розробляєте його? Жахливий.
Олександр Міллс

Настає 2020 рік, і я не можу повірити, що вони досі цього не виправили (навіть не використовуючи прапор компілятора). Я робив проект у Go близько 5 років тому, і загалом сподобалась мова, але вона була непридатною для мене виключно через це. Те, як я кодую, я постійно коментую / коментую речі, тому ця "функція" у програмі "Go" робить для мене вдвічі більший час ... З тих пір я перевіряю назад кожні кілька місяців, щоб побачити, чи відчув розум розум команда Go, і поки що не пощастило ... Відстій. Інакше це чудова мова, і я хотів би використовувати її більше, але наразі вона просто не корисна для мене.
Руслан

Відповіді:


234

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

Але якщо ви дійсно хочете пропустити цю помилку, можете скористатися порожнім ідентифікатором ( _):

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 не дозволяє жодного.


90
Все-таки це не так відрізняється від того, щоб коментувати це. І я розумію, що це для кращого коду, але було б краще, якщо ми можемо закрити перевірку, чому тестуємо наш код, а потім знову відкрити цю перевірку після того, як ми хочемо закінчити код і зробити його чистим?
А-летуб

21
@kostix Ну .. це може не сповільнити вас, тому що ви можете бути експертом, але це для мене і те, як я кодую. Мені просто цікаво, чи є кращий спосіб. Але все одно, дякую за поширені запитання! Читаючи це, я можу повністю зрозуміти, з яких причин голанг так робить.
A-letubby

20
Чи є аргумент командного рядка, щоб вимкнути це? Або це незмінна функція?
Етан Бірлен

26
FWIW, мені було погано читати код інших, але точно не через невикористані символи. ОТО, я сьогодні втратив годину на пошук методів, щоб вирішити цю "# функцію".
Торстен Бронгер

24
На жаль, ця відповідь правильна - але це не виправдовує її. Існує різниця між перевіркою коду та простою його виконанням. Коли ми перевіряємо код, ми використовуємо підводки, щоб знайти цю помилку. Коли ми виконуємо під час швидкого розвитку, у нас немає однакових стандартів. Незрозуміло плутати компілятор з лайнером. Навіть поліція стилів всередині Google не помиляється.
Тревіс Вілсон

29

Для цього ви можете використовувати просту "нульову функцію", наприклад:

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)
}

29

Відповідно до FAQ :

Деякі запитували варіант компілятора, щоб відключити ці чеки або принаймні зменшити їх до попереджень. Такий варіант не був доданий, оскільки параметри компілятора не повинні впливати на семантику мови та через те, що компілятор 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
tasty := "ice cream"
horrible := "marmite"

// Commented out for debugging
//eat(tasty, horrible)

_, _ = tasty, horrible

9

Один з невідомих раніше кутів - це набори інструментів, які використовуються для редагування коду.

Використання Visual Studio Code разом із розширенням від lukehoban, що викликається Go, зробить для вас деяку автоматичну магію. Розширення Go автоматично запускається gofmt, і golintт.д., і видаляє і додає importзаписи . Тож принаймні ця частина тепер є автоматичною.

Я визнаю, що це не 100% вирішення питання, але все-таки досить корисне.


8

Якщо іншим важко це зрозуміти, я думаю, це може допомогти пояснити це дуже просто. Якщо у вас є змінна, яку ви не використовуєте, наприклад функція, щодо якої ви прокоментували виклик (звичайний випадок використання):

myFn := func () { }
// myFn()

Ви можете призначити непотрібну / порожню змінну функції, щоб вона більше не використовувалася :

myFn := func () { }
_ = myFn
// myFn()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.