types - porque - ¿Es posible definir la igualdad para tipos/estructuras con nombre?
igualdad wikipedia (2)
Go soporta estructuras de verificación de igualdad.
type Person struct {
Name string
}
a := Person{"Bill DeRose"}
b := Person{"Bill DeRose"}
a == b // true
No funcionará con los campos de puntero (de la forma que desee) porque las direcciones de puntero son diferentes.
type Person struct {
Friend *Person
}
a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}
a == b // false
No puede modificar el operador de igualdad y no hay una forma integrada de agregar soporte para tipos personalizados para usar la sintaxis ==
. En su lugar, debe comparar los valores de puntero utilizando reflect.DeepEqual
.
import "reflect"
a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}
reflect.DeepEqual(a, b) // true
Tenga en cuenta que hay advertencias.
En general, DeepEqual es una relajación recursiva del operador == de Go. Sin embargo, esta idea es imposible de implementar sin cierta inconsistencia. Específicamente, es posible que un valor sea desigual a sí mismo, ya sea porque es de tipo func (incomparable en general) o porque es un valor NaN de punto flotante (no es igual a sí mismo en comparación de punto flotante), o porque es una matriz, estructura o interfaz que contiene dicho valor.
Después de leer una pregunta relacionada sobre el uso de cortes en mapas, sentí curiosidad por la igualdad en Go.
Sé que es posible anular el método equals
de un Object
Java. ¿Hay una manera similar de definir cómo Go comprueba la igualdad de tipos / estructuras definidas por el usuario? Si es así, habría una solución para el problema mencionado anteriormente. Pensé que el uso de los valores de la interface{}
podría ofrecer una solución, pero recibí el mensaje de error panic: runtime error: hash of unhashable type []int
.
No, esto no es definible por el usuario. Go tiene reglas estrictas: lo que cuenta como igual, e incluso lo que es comparable, que se basa en la asignabilidad. Eche un vistazo a golang.org/ref/spec#Comparison_operators .