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

Я изучаю новый язык 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);
}

person Isaiah    schedule 11.11.2009    source источник
comment
os.Getwd возвращает строку и объект ошибки. Я пробовал cwd := os.Getwd(); и это дает ошибку, потому что os.Getwd возвращает два объекта.   -  person Isaiah    schedule 12.11.2009
comment
Мне нравится компилятор, который применяет часто используемую парадигму предупреждений ARE-ошибок;)   -  person phoebus    schedule 12.11.2009
comment
Да, но действительно ли неиспользуемые переменные в языке с сборщиком мусора стоят ошибки?   -  person Isaiah    schedule 12.11.2009
comment
@Pynt: я думаю, что предполагается, что, поскольку вам не нужно объявлять переменные, любая переменная в коде существует по какой-то причине; поэтому, если вы хотели его использовать и не использовали, вероятно, это ошибка. Также это поощряет проверку ошибок.   -  person György Andrasek    schedule 12.11.2009
comment
@Jurily: Хорошие моменты, но для некоторых функций, которые я, вероятно, использовал бы только одну переменную и проигнорировал бы остальные (скажем, они не ошибки), было бы раздражающе создавать фиктивный оператор.   -  person Isaiah    schedule 12.11.2009
comment
По словам Роба Пайка в его выступлении по Go tech, причиной того, что это ошибка, является то, что дизайнеры хотели принудительно удалить мусор.   -  person Grumdrig    schedule 12.11.2009


Ответы (7)


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

cwd, _ := os.Getwd();

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

person Matthew Crumley    schedule 11.11.2009
comment
Спасибо. По какой-то причине ошибка, возвращаемая os.Getwd(), не равна нулю, но cwd по-прежнему является правильной строкой. Странный. Может быть, ошибка никогда не равна нулю. - person Isaiah; 12.11.2009

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

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

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

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

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

person Brad Clawsie    schedule 09.02.2012
comment
Да это очень раздражает. - person sergserg; 03.11.2013

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

cwd, error := os.Getwd();
if error == nil {
    fmt.Printf(cwd);
}
person György Andrasek    schedule 11.11.2009

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

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

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

person Russ Cox    schedule 12.11.2009

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

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

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

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

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

person rivalitaet    schedule 10.08.2011
comment
В Go не пишите a = a, пишите _ = a. - person peterSO; 12.08.2011
comment
В чем преимущество _ = a перед a = a? - person Kitsune; 15.08.2011
comment
Преимущество _ = a в том, что подчеркивание — это идиоматический способ Go выразить мысль о том, что значение не используется. Использование _ делает смысл кода совершенно понятным для другого программиста. - person Adam Crossland; 19.01.2012

Вы можете решить проблему с неиспользуемой переменной, выполнив один из этих двух методов.

  1. По устранению ошибки

    cwd, ошибка := os.Getwd() если ошибка !=nil{ fmt.Println(ошибка) }

  2. Здесь само значение нам не понадобилось, поэтому мы его проигнорировали пустым идентификатором _

    cwd, _ := os.Getwd()

person 0example.com    schedule 09.02.2021