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 no empty
porque el valor cero de a bool
sea false
, por lo que si crea una nueva estructura como Session{}
su ready
campo será automáticamente false
y le dirá la verdad: que la estructura aún no está lista (está vacía).
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
Cuando inicializa la estructura, debe establecerlo ready
en true
. Su isEmpty()
método ya no es necesario (aunque puede crear uno si lo desea) porque puede probar el ready
campo en sí.
var s Session
if !s.ready {
// do stuff (populate 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ío string
""
, puede usarlo para probar si su estructura está vacía de esta manera:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
En este caso, vale la pena incorporar esta verificación en un isEmpty()
método porque esta verificación depende de la implementación:
func (s Session) isEmpty() bool {
return s.playerId == ""
}
Y usándolo:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
Use el puntero a su estructura
La segunda sugerencia es usar un puntero a la estructura: *Session
. Los punteros pueden tener nil
valores, por lo que puede probarlos:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}