2009-11-11 9 views
6

Estoy aprendiendo el nuevo idioma de Google Go. Sólo estoy tratando de cosas y me di que si se declara una variable y no hace nada con ella el compilador Go (8g en mi caso) no logra
compilar con este error: hello.go:9: error declared and not used. Me sorprendió que, dado que la mayoría de los compiladores de lenguaje solo advierten acerca de las variables no utilizadas, pero aún se compilan."compilación declarada y no utilizada" error de compilación

¿Hay alguna forma de evitar esto? Revisé la documentación del compilador y no veo nada que pueda cambiar este comportamiento. ¿Hay alguna manera de simplemente eliminar error para que se compile?

package main 

import "fmt" 
import "os" 

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

os.Getwd devuelve una cadena y un objeto de error. Lo he intentado con "cwd: = os.Getwd();" y eso da un error porque os.Getwd devuelve dos objetos. –

+0

Me gusta un compilador que aplica el paradigma de "advertencias son errores" frecuentemente utilizado;) – phoebus

+0

Sí, pero las variables no utilizadas en un lenguaje GC realmente vale la pena un "Error"? –

Respuesta

21

Usted podría intentar esto:

cwd, _ := os.Getwd(); 

pero parece que sería mejor mantener el error como en la respuesta de Jurily para que sepa si algo ha ido mal.

+0

Gracias. Por algún motivo, el error devuelto por os.Getwd() no es nulo, pero cwd sigue siendo la cadena correcta. Extraño. Quizás el error nunca sea nulo. –

4

¿Funciona?

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

Usted puede averiguar lo que el error es mediante la importación "FMT" y el uso de

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

¿Qué quiere imprimir?

1

Si realmente quiere eliminar el error de compilación, puede intentar algo como 'a = a', o 'error = error'.

Los argumentos que provienen de algunas personas aquí, que afirman que tales errores de compilación son geniales porque evitan una gran cantidad de errores, son ciertos para la mayoría de las situaciones, por lo que debe evitar dichas construcciones. Por otro lado, me gusta probar, si el código que escribo realmente compila! Y en ese caso es bueno, no tener que eliminar todas las variables declaradas & no utilizadas. ¡Entonces use el constructo 'a = a' raramente y no los deje allí!

+6

En Go, no escriba 'a = a', escriba' _ = a'. – peterSO

+0

¿Cuál es la ventaja de '_ = a' sobre' a = a'? – Kitsune

+1

Una ventaja de '_ = a' es que el guión bajo es la forma idiomática de Go de expresar la idea de que no se usa un valor. Usar _ hace que el significado del código quede perfectamente claro para otro programador. –

8

esto puede hacer que el desarrollo sea un poco molesto. a veces ejecuto un código que tiene variables declaradas pero no utilizadas (pero se usará ).

en estos casos i sencilla de hacer esto:

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

y allí, que son "usado".

me gustaría ver un indicador de ir herramientas que me permite suprimir este error durante el desarrollo.

+1

Sí, esto es muy molesto. – sergserg

1

Tuve la misma situación que tú. Desde docs:

Can I stop these complaints about my unused variable/import?

The presence of an unused variable may indicate a bug, while unused imports just slow down compilation. Accumulate enough unused imports in your code tree and things can get very slow. For these reasons, Go allows neither.

When developing code, it's common to create these situations temporarily and it can be annoying to have to edit them out before the program will compile.

Some have asked for a compiler option to turn those checks off or at least reduce them to warnings. Such an option has not been added, though, because compiler options should not affect the semantics of the language and because the Go compiler does not report warnings, only errors that prevent compilation.

There are two reasons for having no warnings. First, if it's worth complaining about, it's worth fixing in the code. (And if it's not worth fixing, it's not worth mentioning.) Second, having the compiler generate warnings encourages the implementation to warn about weak cases that can make compilation noisy, masking real errors that should be fixed.

It's easy to address the situation, though. Use the blank identifier to let unused things persist while you're developing.

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. 
    .... 
} 
Cuestiones relacionadas