オレイアデに加えて、ゼロ値に関する仕様を参照してください:
宣言またはmakeまたはnewの呼び出しによって値を格納するためにメモリが割り当てられ、明示的な初期化が提供されない場合、メモリにはデフォルトの初期化が与えられます。そのような値の各要素は、そのタイプのゼロ値に設定されます。ブール値の場合はfalse、整数の場合は0、浮動小数点数の場合は0.0、文字列の場合は ""、ポインター、関数、インターフェイス、スライス、チャネル、およびマップの場合はnilです。この初期化は再帰的に行われるため、たとえば、値が指定されていない場合、構造体の配列の各要素のフィールドはゼロになります。
ご覧のとおり、nil
はすべてのタイプのゼロ値ではなく、ポインター、関数、インターフェース、スライス、チャネル、およびマップに対してのみです。これがconfig == nil
エラーであり、エラーで&config == nil
はない理由です
。
あなたの構造体が初期化されていないかどうかを確認するには、(例えば、それぞれのゼロ値のためのすべてのメンバーをチェックする必要があるだろうhost == ""
、port == 0
など)や内部の初期化メソッドによって設定されたプライベートなフィールドを持っています。例:
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 }