Eu defino uma estrutura ...
type Session struct {
playerId string
beehive string
timestamp time.Time
}
Às vezes eu atribuo uma sessão vazia a ele (porque nil não é possível)
session = Session{};
Então, quero verificar, se está vazio:
if session == Session{} {
// do stuff...
}
Obviamente, isso não está funcionando. Como faço para escrever isso?
Respostas:
Você pode usar == para comparar com um literal composto de valor zero porque todos os campos são comparáveis :
exemplo de playground
Por causa de uma ambigüidade de análise , os parênteses são necessários em torno do literal composto na condição if.
O uso de
==
acima se aplica a structs onde todos os campos são comparáveis . Se a estrutura contém um campo não comparável (fatia, mapa ou função), então os campos devem ser comparados um a um com seus valores zero.Uma alternativa para comparar o valor inteiro é comparar um campo que deve ser definido como um valor diferente de zero em uma sessão válida. Por exemplo, se o id do jogador deve ser! = "" Em uma sessão válida, use
fonte
session
não for nulo*Session
, useif (Session{} == *session {
.struct containing []byte cannot be compared
porque, bem, minha estrutura contém uma fatia de byte.==
comparação com os campos de fatia falhará. Para comparar essas estruturas, usereflect.DeepEqual
ou considere algo mais especializado, como discutido aqui: stackoverflow.com/questions/24534072/…Aqui estão mais 3 sugestões ou técnicas:
Com um campo adicional
Você pode adicionar um campo adicional para saber se a estrutura foi preenchida ou está vazia. Eu o nomeei intencionalmente
ready
e nãoempty
porque o valor zero de abool
éfalse
, então se você criar uma nova estrutura comoSession{}
seuready
campo será automaticamentefalse
e ele dirá a verdade: que a estrutura ainda não está pronta (está vazia).Ao inicializar a estrutura, você deve definir
ready
comotrue
. SeuisEmpty()
método não é mais necessário (embora você possa criar um se quiser) porque você pode apenas testar oready
próprio campo.A significância deste
bool
campo adicional aumenta à medida que a estrutura fica maior ou se contém campos que não são comparáveis (por exemplo, fatiamap
e valores de função).Usando o valor zero de um campo existente
Isso é semelhante à sugestão anterior, mas usa o valor zero de um campo existente que é considerado inválido quando a estrutura não está vazia. A usabilidade disso depende da implementação.
Por exemplo, se em seu exemplo seu
playerId
não pode estar vaziostring
""
, você pode usá-lo para testar se sua estrutura está vazia assim:Neste caso, vale a pena incorporar esta verificação em um
isEmpty()
método porque esta verificação depende da implementação:E usando:
Use o ponteiro para sua estrutura
A segunda sugestão é usar um ponteiro para a sua estrutura:
*Session
. Os ponteiros podem ternil
valores, então você pode testá-los:fonte
Usar reflect.deepEqual também funciona , especialmente quando você tem um mapa dentro da estrutura
fonte
Lembre-se de que, com ponteiros para struct, você terá que cancelar a referência da variável e não compará-la com um ponteiro para struct vazio:
Verifique este playground .
Também aqui você pode ver que uma estrutura contendo uma propriedade que é uma porção de ponteiros não pode ser comparada da mesma maneira ...
fonte
Como alternativa às outras respostas, é possível fazer isso com uma sintaxe semelhante à que você pretendia originalmente, se fizer isso por meio de uma
case
instrução em vez deif
:exemplo de playground
fonte
Apenas uma adição rápida, porque eu abordei o mesmo problema hoje:
Com Go 1.13 é possível usar o novo
isZero()
método:Não testei isso em relação ao desempenho, mas acho que deve ser mais rápido do que comparar via
reflect.DeepEqual()
.fonte
Talvez algo como isso
fonte