Vejo muito código no Go para detectar nada, assim:
if err != nil {
// handle the error
}
no entanto, eu tenho uma estrutura como esta:
type Config struct {
host string
port float64
}
e config é uma instância do Config, quando:
if config == nil {
}
há erro de compilação, dizendo: não é possível converter nil para digitar Config
Respostas:
O compilador está apontando o erro para você; você está comparando uma instância de estrutura e nada. Eles não são do mesmo tipo, por isso considera uma comparação inválida e gritam com você.
O que você deseja fazer aqui é comparar um ponteiro com sua instância de configuração com zero, que é uma comparação válida. Para fazer isso, você pode usar o golang new builtin ou inicializar um ponteiro para ele:
ou
ou
Então você poderá verificar se
fonte
var config &Config // nil
deveria ser:var config *Config
var config *Config
trava cominvalid memory address or nil pointer dereference
. Talvez precisemosvar config Config
Além da Oleiade, consulte a especificação sobre valores zero :
Como você pode ver,
nil
não é o valor zero para todos os tipos, mas apenas para ponteiros, funções, interfaces, fatias, canais e mapas. Esta é a razão pela qualconfig == nil
é um erro e&config == nil
não é.Para verificar se o struct é inicializado você teria que verificar cada membro de seu respectivo valor zero (por exemplo
host == ""
,port == 0
, etc.) ou ter um campo privado, que é definido por um método de inicialização interno. Exemplo:fonte
time.Time
tem umIsZero()
método. No entanto, você também pode fazervar t1 time.Time; if t1 == time.Time{}
e também podeif config == Config{}
verificar todo o campo (a igualdade de estrutura está bem definida em Ir). No entanto, isso não é eficiente se você tiver muitos campos. E, talvez o valor zero seja um valor sensato e utilizável, portanto, passar um não é especial.func (c *Config) Initialized() bool { return !(c == nil) }
Eu criei um código de exemplo que cria novas variáveis usando várias maneiras em que consigo pensar. Parece que as três primeiras maneiras de criar valores e as duas últimas criam referências.
quais saídas:
fonte
Você também pode verificar como
struct_var == (struct{})
. Isso não permite comparar com zero, mas verifica se foi inicializado ou não. Tenha cuidado ao usar este método. Se sua estrutura puder ter valores zero para todos os seus campos, você não terá muito tempo.http://play.golang.org/p/RXcE06chxE
fonte
A especificação da linguagem menciona os comportamentos dos operadores de comparação:
operadores de comparação
Atribuição
fonte
No Go 1.13 e posterior, você pode usar o
Value.IsZero
método oferecido noreflect
pacote.Além dos tipos básicos, ele também funciona para Array, Chan, Func, Interface, Mapa, Ptr, Slice, UnsafePointer e Struct. Veja isto para referência.
fonte