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:
int, float64, ...)string, rune)¡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.
"¿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
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.