В дополнение к Oleiade, смотрите спецификацию на нулевые значения :
Когда память выделяется для хранения значения либо через объявление, либо через вызов make или new, и не предоставляется явная инициализация, памяти назначается инициализация по умолчанию. Каждому элементу такого значения присваивается нулевое значение для его типа: false для логических значений, 0 для целых чисел, 0.0 для чисел с плавающей запятой, "" для строк и ноль для указателей, функций, интерфейсов, секций, каналов и карт. Эта инициализация выполняется рекурсивно, поэтому, например, каждый элемент массива структур будет обнулять свои поля, если не указано значение.
Как видите, 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 }