Além da Oleiade, consulte a especificação sobre valores zero :
Quando a memória é alocada para armazenar um valor, por meio de uma declaração ou uma chamada de marca ou nova, e nenhuma inicialização explícita é fornecida, a memória recebe uma inicialização padrão. Cada elemento desse valor é definido com o valor zero para seu tipo: false para booleanos, 0 para números inteiros, 0,0 para números flutuantes "" para seqüências de caracteres e nulo para ponteiros, funções, interfaces, fatias, canais e mapas. Essa inicialização é feita recursivamente, portanto, por exemplo, cada elemento de uma matriz de estruturas terá seus campos zerados se nenhum valor for especificado.
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 qual config == 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:
type Config struct {
Host string
Port float64
setup bool
}
func NewConfig(host string, port float64) *Config {
return &Config{host, port, true}
}
func (c *Config) Initialized() bool { return c != nil && c.setup }