¿Qué es "_" (coma de subrayado) en una declaración de Go?


100

Y parece que no puedo entender este tipo de declaración de variable:

_, prs := m["example"]

¿Qué está _,haciendo exactamente " " y por qué han declarado una variable como esta en lugar de

prs := m["example"]

(Lo encontré como parte de Go by Example: Maps )


3
Para futuras preguntas sobre el idioma, primero consulte las especificaciones . Debería responder a todas sus preguntas.
fuz

Como comentario: prsprobablemente significa "presente". El código en su ejemplo verifica la presencia o ausencia de una entrada "example"en el mmapa.
dyoo

6
@FUZxxl Sí, eché un vistazo allí anteriormente, pero como no sabía el nombre de la función, no la encontré. Además, encuentro que las especificaciones oficiales para lenguajes de programación no son muy pedagógicas y más bien aprenden con el ejemplo.
Kansuler

@dyoo Una vez que tuve la explicación a continuación, descubrí su significado, ¡pero vale la pena señalar si alguien más tiene la misma pregunta!
Kansuler

8
@FUZxxl: No lo sé. La mayoría de las preguntas formuladas en SO probablemente tengan respuestas disponibles en alguna parte. Existe algún umbral por debajo del cual probablemente no se debería hacer una pregunta, pero no creo que esta pregunta quede por debajo de eso.
jueves

Respuestas:


120

Evita tener que declarar todas las variables para los valores devueltos.
Se llama identificador en blanco .

Como en:

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

(el otro ' _' caso de uso es para la importación )

Dado que descarta el valor devuelto, es útil cuando desea verificar solo uno de los valores devueltos, como en " ¿Cómo probar la existencia de claves en un mapa? " Que se muestra en " Eficaz, mapa ":

_, present := timeZone[tz]

Para probar la presencia en el mapa sin preocuparse por el valor real, puede usar el identificador en blanco, un simple subrayado ( _).
El identificador en blanco puede asignarse o declararse con cualquier valor de cualquier tipo, descartándose el valor sin causar daño.
Para probar la presencia en un mapa, use el identificador en blanco en lugar de la variable habitual para el valor.

Como agrega Jsor en los comentarios :

"estándar generalmente aceptado" es llamar a las variables de prueba de membresía "ok" (lo mismo para verificar si la lectura de un canal era válida o no)

Eso te permite combinarlo con test:

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

Lo encontrarás también en bucle:

Si solo necesita el segundo elemento del rango (el valor), utilice el identificador en blanco, un guión bajo, para descartar el primero:

sum := 0
for _, value := range array {
    sum += value
}

Gracias por dar un buen ejemplo. Me tomó pensar un poco para entender el concepto, ¡pero ahora lo hago!
Kansuler

Tenga en cuenta que IME "estándar generalmente aceptado" es llamar a las variables de prueba de membresía "ok" (lo mismo para verificar si una lectura de canal era válida o no).
LinearZoetrope

1
@Jsor estoy de acuerdo. Incluí su comentario en la respuesta para mayor visibilidad y agregué algunos ejemplos adicionales.
VonC

63

El compilador de Go no le permitirá crear variables que nunca use.

for i, value := range x {
   total += value
}

El código anterior devolverá un mensaje de error "declaré y no utilicé".

Como no usamos i dentro de nuestro ciclo, necesitamos cambiarlo a esto:

for _, value := range x {
   total += value
}

12
Su primera oración fue importante para comprender la razón por la que hay un _ como identificador en blanco.
Tarik

4

_es el identificador en blanco. Es decir, se descarta el valor que debería asignarse.

Aquí está el valor de la exampleclave que se descarta. La segunda línea de código descartaría el booleano de presencia y almacenaría el valor en prs.
Entonces, para verificar solo la presencia en el mapa, puede descartar el valor. Esto se puede utilizar para utilizar un mapa como conjunto.


3

El identificador en blanco se puede usar siempre que la sintaxis requiera un nombre de variable pero la lógica del programa no, por ejemplo, para descartar un índice de bucle no deseado cuando solo requerimos el valor del elemento.

Extracto de:

El lenguaje de programación Go (Serie de Computación Profesional Addison-Wesley)

Brian W. Kernighan

Este material puede estar protegido por derechos de autor.


2

Se llama identificador en blanco y ayuda en los casos en que desea descartar el valor que se va a devolver y no hacer referencia a él.

Algunos lugares donde lo usamos:

  • Una función devuelve un valor y no tiene la intención de usarlo en el futuro
  • Quiere iterar y necesita un valor i que no utilizará

2

El gran caso de uso de la variable no utilizada es la situación en la que solo necesita una salida parcial. En el siguiente ejemplo, solo necesitamos imprimir el valor (población del estado).

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

1

Básicamente, _,conocido como identificador en blanco. En GO no podemos tener variables que no se estén utilizando.

Como una instancia cuando itera a través de una matriz si está usando value: = range , no quiere un valor i para iterar. Pero si omite el valor i, devolverá un error. Pero si declara i y no lo usó, también devolverá un error.

Por tanto, ese es el lugar donde tenemos que utilizar _,.

También se usa cuando no desea el valor de retorno de una función en el futuro.


0

No se permite una variable no utilizada en Golang

Si viene de otros lenguajes de programación, puede resultar un poco difícil acostumbrarse a esto. Pero esto da como resultado un código más limpio. Entonces, al usar un _, estamos diciendo que sabemos que hay una variable allí pero no queremos usarla y le decimos al compilador que no se queja de eso. :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.