«переменная объявлена ​​и не используется» ошибка компиляции - PullRequest
7 голосов
/ 12 ноября 2009

Я изучаю новый язык Google Go . Я просто пробую вещи, и я заметил что если вы объявляете переменную и ничего с ней не делаете, компилятору go ( 8g в моем случае) не удается
скомпилировать с этой ошибкой: hello.go:9: error declared and not used. Я был удивлен этим, так как большинство языковых компиляторов просто предупреждают о неиспользуемых переменных, но все еще компилируют.

Могу ли я как-нибудь обойти это? Я проверил документацию для компилятора и не вижу ничего, что могло бы изменить это поведение. Есть ли способ просто удалить error, чтобы он скомпилировался?

package main

import "fmt"
import "os"

func main()
{
     fmt.Printf("Hello World\n");
     cwd, error := os.Getwd();
     fmt.Printf(cwd);
}

Ответы [ 6 ]

22 голосов
/ 12 ноября 2009

Вы можете попробовать это:

cwd, _ := os.Getwd();

но похоже, что было бы лучше оставить ошибку, как в ответе Джурили, чтобы вы знали, если что-то пошло не так.

9 голосов
/ 10 февраля 2012

это может сделать развитие немного болезненным. иногда я запускаю код с объявленными, но не используемыми переменными (но будет использоваться ).

в этих случаях я просто делаю это:

fmt.Printf ("% v% v% v", somevar1, somevar2, somevar3)

и там они "используются".

Я хотел бы видеть флажок для инструментов go, который позволяет мне устранить эту ошибку во время разработки.

4 голосов
/ 12 ноября 2009

Это работает?

cwd, error := os.Getwd();
if error == nil {
    fmt.Printf(cwd);
}
2 голосов
/ 12 ноября 2009

Вы можете узнать, в чем ошибка, импортировав "fmt" и используя

cwd, err := os.Getwd();
if err != nil {
    fmt.Printf("Error from Getwd: %s\n", err)
}

Что это печатает?

1 голос
/ 10 апреля 2014

У меня была такая же ситуация, как и у вас. Из документов :

Могу ли я прекратить эти жалобы по поводу моей неиспользованной переменной / импорта?

Наличие неиспользуемой переменной может указывать на ошибку, в то время как неиспользуемый импорт только замедляет компиляцию. Накопите достаточно неиспользованных импортов в вашем дереве кода, и все может стать очень медленным. По этим причинам Go не позволяет ни того, ни другого.

При разработке кода обычно временно создают такие ситуации, и может быть неприятно, что их нужно редактировать до компиляции программы.

Некоторые просили опцию компилятора, чтобы отключить эти проверки или, по крайней мере, уменьшить их до предупреждений. Однако такой параметр не был добавлен, поскольку параметры компилятора не должны влиять на семантику языка и поскольку компилятор Go не выдает предупреждения, а только ошибки, которые мешают компиляции.

Есть две причины отсутствия предупреждений. Во-первых, если стоит пожаловаться, стоит исправить в коде. (И если это не стоит исправлять, упоминать не стоит.) Во-вторых, компилятор генерирует предупреждения, побуждающие реализацию предупреждать о слабых случаях, которые могут создавать компиляцию, и маскировать реальные ошибки, которые должны быть исправлены.

Впрочем, разобраться с ситуацией легко. Используйте пустой идентификатор, чтобы неиспользованные вещи сохранялись во время разработки.

import "unused"

// This declaration marks the import as used by referencing an
// item from the package.
var _ = unused.Item  // TODO: Delete before committing!

func main() {
    debugData := debug.Profile()
    _ = debugData // Used only during debugging.
    ....
}
1 голос
/ 10 августа 2011

Если вы действительно хотите удалить ошибку компиляции, вы можете попробовать что-то вроде «a = a» или «error = error».

Аргументы, исходящие от некоторых здесь присутствующих, утверждающих, что такие ошибки компиляции велики, потому что они предотвращают много беспорядка, верны для большинства ситуаций, поэтому вам следует избегать таких конструкций. С другой стороны, мне очень нравится проверять, действительно ли код, который я пишу, компилируется! И в этом случае это хорошо, не нужно удалять все объявленные и неиспользованные переменные. Поэтому используйте конструкцию 'a = a' редко и не оставляйте их там!

...