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 readyy no emptyporque el valor cero de a boolsea false, por lo que si crea una nueva estructura como Session{}su readycampo será automáticamente falsey 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 readyen true. Su isEmpty()método ya no es necesario (aunque puede crear uno si lo desea) porque puede probar el readycampo en sí.
var s Session
if !s.ready {
// do stuff (populate s)
}
La importancia de este boolcampo adicional aumenta a medida que la estructura crece o si contiene campos que no son comparables (p. Ej., mapValores 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 playerIdno 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 nilvalores, por lo que puede probarlos:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}