«Переменная объявлена и не используется» ошибка компиляции

Я учу гуглс новым языкомИдти, Я просто пробую что-то, и я заметил, что если вы объявляете переменную и ничего с ней не делаете, компилятор 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);
}
 Grumdrig12 нояб. 2009 г., 05:02
По словам Роба Пайка в его техническом выступлении на Go, мотивом этого является ошибка, заключающаяся в том, что дизайнеры хотели принудительно удалить удаление.
 György Andrasek12 нояб. 2009 г., 00:15
@Pynt: я думаю, что предположение, что, так как вы ненужно объявлять переменные, любая переменная в коде присутствует по причине; поэтому, если вы хотите использовать его, и нет, этоВозможно, это ошибка. Также это поощряет проверку ошибок.
 phoebus12 нояб. 2009 г., 00:10
Я вроде как компилятор, который обеспечивает часто используемые "предупреждения являются ошибками " парадигма;)
 Alvin Row12 нояб. 2009 г., 00:11
Да, но неиспользуемые переменные в GC 'язык действительно стоит тогоОшибка"?
 Alvin Row12 нояб. 2009 г., 00:09
os.Getwd возвращает строку и объект ошибки. Я пытался "cwd: = os.Getwd (); " и это дает ошибку, потому что os.Getwd возвращает два объекта.
 Alvin Row12 нояб. 2009 г., 00:22
@Jurily: Хорошие моменты, но для некоторых функций я бы, вероятно, использовал только одну переменную и игнорировал бы остальные (допустим, они не 't ошибок) было бы неприятно создавать фиктивное утверждение.

Ответы на вопрос(6)

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

cwd, error := os.Getwd();
if error == nil {
    fmt.Printf(cwd);
}

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

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

fmt.Printf (»% v% v% v ", Somevar1, somevar2, somevar3)

и вот онииспользуется».и»

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

 sergserg03 нояб. 2013 г., 04:01
Да, это очень раздражает.

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

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

Наличие неиспользуемой переменной может указывать на ошибку, в то время как неиспользуемый импорт просто замедляет компиляцию. Накопите достаточно неиспользованных импортов в вашем дереве кода, и все может стать очень медленным. По этим причинам 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.
    ....
}

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

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

 Kitsune15 авг. 2011 г., 17:45
Какие'с преимуществом_ = a над ?a = a
 peterSO12 авг. 2011 г., 05:07
В Го, нет писатьa = a, записывать ._ = a
 Adam Crossland19 янв. 2012 г., 17:21
Преимущество_ = a является то, что подчеркивание Gos идиоматический способ выразить идею, что значение не используется. Использование _ делает смысл кода совершенно понятным для другого программиста.
Решение Вопроса

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

cwd, _ := os.Getwd();

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

 Alvin Row12 нояб. 2009 г., 00:25
Благодарю. По какой-то причине ошибка, возвращаемая os.Getwd (), не равна nil, но cwd по-прежнему является правильной строкой. Weird. Возможно ошибка никогда не равна нулю.

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

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

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

Ваш ответ на вопрос