Comparabilidad por tipo
Los tipos de datos básicos siempre son comparables utilizando el==
y!=
operadores:enterovalores,punto flotantenúmeros,complejonúmeros,booleanovalores,cuerdavalores,constantevalores.
Formaciónlos valores son comparables, si contienen un tipo de elemento comparable
Punterolos valores son comparables.
Canallos valores son comparables.
Interfazlos valores son comparables.
ComparandointerfazLos valores funcionan solo si el tipo dinámico es comparable.
Funciónvalores,Rodajavalores yMapalos valores sonnocomparables, solo se pueden comparar connil
, como caso especial.
Las reglas de la comparación
De la especificación Go:
Booleanolos valores son comparables. Dos valores booleanos son iguales si son ambos
true
o ambosfalse
.Enterolos valores son comparables y ordenados, de la forma habitual.
Punto flotanteLos valores son comparables y ordenados, según lo definido por elIEEE-754estándar.
Complejolos valores son comparables. Dos valores complejos uyv son iguales si ambos
real(u) == real(v)
and
imag (u) == imag (v) `.Cuerdalos valores son comparables y ordenados, léxicamente por bytes.
Punterolos valores son comparables. Dos valores de puntero son iguales si apuntan a la misma variable o si ambos tienen valor
nil
. Los punteros a distintas variables de tamaño cero pueden ser iguales o no.Canallos valores son comparables. Los valores de dos canales son iguales si fueron creados por la misma llamada a realizar o si ambos tienen valor
nil
.Interfazlos valores son comparables. Dos valores de interfaz son iguales si tienen tipos dinámicos idénticos y valores dinámicos iguales o si ambos tienen valor
nil
.Un valor x desin interfazescribe
X
y un valort
deinterfazescribeT
son comparables cuando los valores de tipoX
son comparables yX
implementosT
. Son iguales sit
El tipo dinámico es idéntico alX
y el valor dinámico de t es igual ax
.Estructuralos valores son comparables si todos sus campos son comparables. Dos valores de estructura son iguales si sus correspondientes campos que no están en blanco son iguales.
Formaciónlos valores son comparables si los valores del tipo de elemento de matriz son comparables. Dos valores de matriz son iguales si sus elementos correspondientes son iguales.
No comparar
Si la estructura contiene un campo cuyo tipo no es comparable, obtendrá un error de tiempo de compilación al comparar.
Comparando tipos incomparables: ingreserefect.DeepEqual()
losreflect
El paquete stdlib proporciona elreflect.DeepEqual()
función que toma 2 tipos y devuelve un booleano:
func DeepEqual(x, y interface{}) bool
Los valores de tipos distintos nunca son profundamente iguales, por lo que si pasa 2 tipos diferentes siempre obtendráfalse
.
Formaciónlos valores son profundamente iguales cuando sus elementos correspondientes son profundamente iguales.
Estructuralos valores son profundamente iguales si sus campos correspondientes son profundamente iguales.
FuncLos valores son profundamente iguales si ambos sonnil
; de lo contrario, no son profundamente iguales.
Interfazlos valores son profundamente iguales si tienen valores concretos profundamente iguales.
MapaLos valores son profundamente iguales cuando todos los siguientes son verdaderos: - ambos sonnil
o ambos nonil
- tienen la misma longitud - son el mismo objeto de mapa o sus claves correspondientes (combinadas mediante la igualdad de Go) se asignan a valores profundamente iguales.
Punterolos valores son profundamente iguales si son iguales usando Go's==
operador o si apuntan a valores profundamente iguales.
RodajaLos valores son profundamente iguales cuando todos los siguientes son verdaderos: - ambos sonnil
o ambos nonil
- tienen la misma longitud, - apuntan a la misma entrada inicial de la misma matriz subyacente (es decir,&x[0] == &y[0]
) o sus elementos correspondientes (hasta la longitud) son profundamente iguales.
Un segmento vacío no nulo y unnil
rebanada (por ejemplo,[]byte{}
y[]byte(nil)
) no son profundamente iguales.
Otros valores -números,bools,instrumentos de cuerda, ycanales- son profundamente iguales si son iguales utilizando el operador == de Go.
Algunos casos "especiales" inevitables que vale la pena enumerar:es posible que un valor no sea igual a sí mismo: - porque es defunc
tipo - porque es un punto flotanteNaN
valor - porque es unformación,estructura, ointerfazque contiene tal valor
Los valores de puntero son siempre iguales a ellos mismos, incluso si apuntan o contienen valores tan problemáticos, porque comparan iguales usando Go's==
operador, y esa es una condición suficiente para ser profundamente igual, independientemente del contenido.
Lo mismo se aplica arodajasymapas: six
yy
son el mismo segmento o el mismo mapa, son profundamente iguales independientemente del contenido.
Más tutoriales de go:
- Uso de NGINX Reverse Proxy para brindar servicios de Go
- Hacer una copia de una estructura en Go
- Los conceptos básicos de un servidor web Go
- Ordenar un tipo de mapa en Go
- Ir consejos en pocas palabras
- Explicación de las etiquetas Go
- Ir al formato de fecha y hora
- Procesamiento JSON con Go
- Ir a funciones variadas
- Hoja de referencia de Go Strings
- Explicación de la interfaz Go Empty
- Depuración de Go con VS Code y Delve
- Parámetros de devoluciones de Go Named
- Generación de cadenas y números aleatorios en Go
- Estructura del sistema de archivos de un proyecto de Go
- Algoritmo de búsqueda binaria implementado en Go
- Uso de indicadores de línea de comando en Go
- GOPATH explicado
- Cree una aplicación de línea de comandos con Go: lolcat
- Construyendo un comando CLI con Go: cowsay
- Uso de Shell Pipes con Go
- Tutorial de Go CLI: clon de la fortuna
- Enumere los archivos en una carpeta con Go
- Use Ir para obtener una lista de repositorios de GitHub
- Ve, agrega un trozo de cadenas a un archivo
- Ve, convierte una cadena en un segmento de bytes
- Visualice sus contribuciones locales de Git con Go
- Introducción a la creación de perfiles de memoria y CPU de Go
- Resolver el error "no admite la indexación" en un programa Go
- Medir el tiempo de ejecución en un programa Go
- Creación de un rastreador web con Go para detectar títulos duplicados
- Siga las mejores prácticas: ¿puntero o receptores de valor?
- Siga las mejores prácticas: ¿Debería utilizar un método o una función?
- Ir a estructuras de datos: Establecer
- Hoja de referencia de Go Maps
- Genere implementaciones para tipos genéricos en Go
- Ir a estructuras de datos: diccionario
- Ir a estructuras de datos: tabla hash
- Implementar oyentes de eventos en canales de paso
- Ir a estructuras de datos: apilar
- Ir a estructuras de datos: cola
- Ir a estructuras de datos: árbol de búsqueda binaria
- Ir a estructuras de datos: gráfico
- Ir a estructuras de datos: lista vinculada
- La guía completa de Go Data Structures
- Comparación de valores de Go
- ¿Go está orientado a objetos?
- Trabajar con una base de datos SQL en Go
- Usar variables de entorno en Go
- Ir al tutorial: API REST respaldada por PostgreSQL
- Habilitación de CORS en un servidor web Go
- Implementación de una aplicación Go en un contenedor Docker
- Por qué Go es un lenguaje poderoso para aprender como desarrollador PHP
- Ve, elimina el carácter de nueva línea io.Reader.ReadString
- Ir, cómo ver los cambios y reconstruir su programa
- Ve, cuenta los meses desde una fecha
- Acceder a los parámetros HTTP POST en Go