Окрім 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 }