Я вижу много кода в Go, чтобы обнаружить ноль, например так:
if err != nil {
// handle the error
}
Тем не менее, у меня есть такая структура:
type Config struct {
host string
port float64
}
и config это экземпляр Config, когда я делаю:
if config == nil {
}
есть ошибка компиляции, говорящая: не может преобразовать ноль в тип Config
Ответы:
Компилятор указывает на ошибку, вы сравниваете экземпляр структуры и nil. Они не одного типа, поэтому он считает это недопустимым сравнением и кричит на вас.
Здесь вы хотите сравнить указатель на ваш экземпляр конфигурации с nil, что является допустимым сравнением. Для этого вы можете использовать новый встроенный golang или инициализировать указатель на него:
или
или
Тогда вы сможете проверить, если
источник
var config &Config // nil
должно быть:var config *Config
var config *Config
вылетает сinvalid memory address or nil pointer dereference
. Может быть, нам нужноvar config Config
В дополнение к Oleiade, смотрите спецификацию на нулевые значения :
Как видите,
nil
это не нулевое значение для каждого типа, а только для указателей, функций, интерфейсов, срезов, каналов и карт. Это причина, почемуconfig == nil
ошибка и&config == nil
нет.Чтобы проверить, не является ли ваша структура неинициализированной, вы должны проверить каждый элемент на предмет его соответствующего нулевого значения (например
host == ""
,port == 0
и т. Д.) Или иметь закрытое поле, которое устанавливается внутренним методом инициализации. Пример:источник
time.Time
естьIsZero()
метод. Однако вы также можете сделать,var t1 time.Time; if t1 == time.Time{}
и вы можете такжеif config == Config{}
проверить все поля для вас (структурное равенство хорошо определено в Go). Однако это неэффективно, если у вас много полей. И, возможно, нулевое значение является нормальным и пригодным для использования значением, поэтому его передача не является особенной.func (c *Config) Initialized() bool { return !(c == nil) }
Я создал пример кода, который создает новые переменные, используя различные способы, которые я могу придумать. Похоже, что первые 3 способа создания значений, а последние два создания ссылок.
какие выводы:
источник
Вы также можете проверить, как
struct_var == (struct{})
. Это не позволяет сравнивать с nil, но проверяет, инициализирован он или нет. Будьте осторожны при использовании этого метода. Если ваша структура может иметь нулевые значения для всех своих полей, у вас не будет отличного времени.http://play.golang.org/p/RXcE06chxE
источник
Спецификация языка описывает поведение операторов сравнения:
операторы сравнения
Переуступка
источник
В Go 1.13 и более поздних версиях вы можете использовать
Value.IsZero
метод, предложенный вreflect
пакете.Помимо основных типов, он также работает для Array, Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer и Struct. Смотрите это для справки.
источник