go - tipos - texto enfatizado html
Significado del subrayado(identificador en blanco) en Go (5)
"Solo hay dos cosas difíciles en Ciencias de la computación: la invalidación de caché y nombrar cosas". Tim Bray citando a Phil Karlton
Se trata de no tener que nombrar cosas.
En Go, cuando no desea utilizar foo
o foo
como nombre de variable de ejemplo, puede usar _
. ¡Eso es! Podrían haber escrito var a I = T{}
, el resultado hubiera sido el mismo (excepto que las variables no utilizadas son un error en Go).
Para otros usos del identificador en blanco, lea Efectivo Ir .
Esta pregunta ya tiene una respuesta aquí:
Cuando estaba leyendo los documentos de Go encontré esto:
Puede pedirle al compilador que verifique que el tipo T implementa la interfaz I al intentar una asignación:
type T struct{}
var _ I = T{} // Verify that T implements I.
No entiendo para qué se usa el _ y lo he visto en otras tareas, pero no puedo entender lo que significa. Al profundizar, encontré que se llama "identificador en blanco" pero no entiendo el caso de uso que ponen:
_ = x // evaluate x but ignore it
Los modismos de Go aún se sienten un poco extraños para mí, así que estoy tratando de entender por qué querría hacer algo como esto.
El compilador Go prácticamente no permite las variables que se declaran pero no se utilizan . Al igual que,
for i, myvalue := range myvar {
total += mvalue
}
El código dado mostrará un error algo en este contexto -> "declarado pero no usado".
Por lo tanto, lo resolvemos utilizando el siguiente fragmento de código:
for _, myvalue := range x {
total += myvalue
}
En cuanto a la parte de importación , se trata de importar un paquete únicamente por sus efectos secundarios.
Por favor, consulte en este link .
En palabras simples _ es un valor ignorado. Go no permite variables locales no utilizadas y emite un error de compilación si intentas hacerlo. Así que engañas al compilador diciendo "ignora este valor" colocando un _
Por ejemplo:
// Here range of os.Args returns index,value
for index,arg in range os.Args[1:] {
fmt.Println(arg)
}
Aquí Go lanza un error de compilación porque no está utilizando el índice (variable local no utilizada) en el bucle. Ahora deberías hacer índice a _ para decir compilador para ignorarlo.
for _,arg in range os.Args[1:] {
fmt.Println(arg)
}
Esto es común en idiomas que permiten múltiples valores de retorno. Hay situaciones en las que en realidad no te importa uno de los valores de retorno.
Por ejemplo, en Go, es común devolver un error. Si por alguna razón no le importa ese error, puede optar por ignorarlo:
value, _ := methodThatReturnsValueAndError()
Sin embargo, si lo asigna y no lo usa, hay un error del compilador:
value, err := methodThatReturnsValueAndError()
// if you don''t use "err" .. its an error
_
es un identificador especial al que se le puede asignar cualquier cosa pero de la que nunca se puede leer. En el primer ejemplo que dio:
var _ I = T{}
No hay forma de acceder a esta variable, por lo que se optimizará fuera del programa resultante. Sin embargo, podría causar un error de compilación si el tipo T
no es asignable a la interfaz I
Entonces, en este caso, se está utilizando como una afirmación estática sobre un tipo.
El segundo caso es más común. Si bien puede parecer extraño descartar el resultado de una llamada a una función, puede tener más sentido en funciones con múltiples retornos. ¿Considerar una función foo
que devuelve dos valores pero solo te interesa el primero? Puedes usar _
para ignorar el segundo:
a, _ = foo()
Puede obtener el mismo efecto creando otra variable para mantener el valor de retorno no deseado, pero esta función significa que no debe preocuparse por elegir un nombre único para él.