Как избежать раздражающей ошибки, объявленной и не использованной, из 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% решения вопроса, но как бы он ни был полезен.