Defino una estructura ...
type Session struct {
playerId string
beehive string
timestamp time.Time
}
A veces le asigno una sesión vacía (porque nulo no es posible)
session = Session{};
Entonces quiero comprobar, si está vacío:
if session == Session{} {
// do stuff...
}
Obviamente, esto no está funcionando. ¿Cómo lo escribo?
Respuestas:
Puede usar == para comparar con un literal compuesto de valor cero porque todos los campos son comparables :
ejemplo de patio de recreo
Debido a una ambigüedad de análisis , se requieren paréntesis alrededor del literal compuesto en la condición if.
El uso de lo
==
anterior se aplica a estructuras donde todos los campos son comparables . Si la estructura contiene un campo no comparable (sector, mapa o función), los campos deben compararse uno por uno con sus valores cero.Una alternativa a comparar el valor completo es comparar un campo que debe establecerse en un valor distinto de cero en una sesión válida. Por ejemplo, si la identificación del jugador debe ser! = "" En una sesión válida, use
fuente
session
es un valor no nulo*Session
, utiliceif (Session{} == *session {
.struct containing []byte cannot be compared
porque, bueno, mi estructura contiene un segmento de bytes.==
comparación con los campos de sector fallará. Para comparar estas estructuras, usereflect.DeepEqual
o considere algo más especializado como se discutió aquí: stackoverflow.com/questions/24534072/…Aquí hay 3 sugerencias o técnicas más:
Con un campo adicional
Puede agregar un campo adicional para saber si la estructura se ha llenado o está vacía. Lo nombré intencionalmente
ready
y noempty
porque el valor cero de abool
seafalse
, por lo que si crea una nueva estructura comoSession{}
suready
campo será automáticamentefalse
y le dirá la verdad: que la estructura aún no está lista (está vacía).Cuando inicializa la estructura, debe establecerlo
ready
entrue
. SuisEmpty()
método ya no es necesario (aunque puede crear uno si lo desea) porque puede probar elready
campo en sí.La importancia de este
bool
campo adicional aumenta a medida que la estructura crece o si contiene campos que no son comparables (p. Ej.,map
Valores de función y de sector).Usar el valor cero de un campo existente
Esto es similar a la sugerencia anterior, pero usa el valor cero de un campo existente que se considera inválido cuando la estructura no está vacía. La usabilidad de esto depende de la implementación.
Por ejemplo, si en su ejemplo
playerId
no puede ser el vacíostring
""
, puede usarlo para probar si su estructura está vacía de esta manera:En este caso, vale la pena incorporar esta verificación en un
isEmpty()
método porque esta verificación depende de la implementación:Y usándolo:
Use el puntero a su estructura
La segunda sugerencia es usar un puntero a la estructura:
*Session
. Los punteros pueden tenernil
valores, por lo que puede probarlos:fuente
Usar reflect.deepEqual también funciona , especialmente cuando tiene un mapa dentro de la estructura
fuente
Tenga en cuenta que con los punteros a la estructura, tendrá que eliminar la referencia de la variable y no compararla con un puntero a la estructura vacía:
Mira este patio de recreo .
También aquí puede ver que una estructura que contiene una propiedad que es una porción de punteros no se puede comparar de la misma manera ...
fuente
Como alternativa a las otras respuestas, es posible hacer esto con una sintaxis similar a la que pretendía originalmente si lo hace a través de una
case
declaración en lugar de unaif
:ejemplo de patio de recreo
fuente
Solo una adición rápida, porque abordé el mismo problema hoy:
Con Go 1.13 es posible utilizar el nuevo
isZero()
método:No probé esto con respecto al rendimiento, pero supongo que debería ser más rápido que comparar a través de
reflect.DeepEqual()
.fuente
Tal vez algo como esto
fuente