ProgramaciónDesarrollador Go

¿Qué tipos de datos en Go se consideran comparables y qué sucede al intentar comparar tipos no comparables? ¿Cómo afecta esto al uso de map y set?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Go, las variables se pueden comparar entre sí usando el operador == o usarlas como clave en un mapa solo si su tipo es comparable. Los tipos comparables incluyen:

  • Todos los tipos numéricos (int, float64, ...)
  • Cadenas (string, rune)
  • Punteros
  • Canales
  • Interfaces, si sus valores son comparables
  • Arreglos y estructuras, si todos sus campos son comparables

¡Los slices, mapas y funciones son no comparables!

Intentar comparar tales valores conduce a un error de compilación. Por ejemplo:

var a = []int{1,2,3} var b = []int{1,2,3} printf("%v", a==b) // error de compilación: los slices solo se pueden comparar con nil

Para usar un valor como clave en un mapa, debe ser necesariamente comparable. Si el tipo no es adecuado, se produce un error de compilación.

Pregunta trampa

"¿Pueden dos estructuras considerarse comparables si solo parte de sus campos no es comparable?"

Muchos responden "sí", pero eso es incorrecto. Si al menos un campo de la estructura no es comparable (por ejemplo, es un slice o un mapa), toda la estructura se convierte en no comparable.

Ejemplo:

type T struct { A int S []string } var t1, t2 T t1 == t2 // error de compilación: Los slices no son comparables

Ejemplos de errores reales debido a la falta de conocimiento sobre las sutilezas del tema


Historia

Un desarrollador intentó usar un slice como clave en un mapa para almacenar en caché los resultados de cálculos, lo que generó un error de compilación. Se reemplazó con un string con un serializador explícito, y el problema se resolvió.


Historia

Al agregar un nuevo campo (tipo slice) a una estructura utilizada como clave en un diccionario, el proyecto dejó de compilar de repente. Razón: ahora la estructura se volvió no comparable, pero nadie esperaba que esto se propagara a las estructuras anidadas.


Historia

Para hacer un conjunto (set) con estructuras que tienen slices dentro, intentaron usar un mapa. Sin entender las reglas de comparación, obtuvieron numerosos errores en tiempo de ejecución al intentar comparar elementos, pero la razón estaba en la imposibilidad de compilarlas con esa clave.