nil значение интерфейса возникает, когда переменная интерфейса содержит nil в качестве базового значения. Это создаёт критическое различие в Go: интерфейс, содержащий nil значение, не равен самому nil.
Когда ты присваиваешь типизированный nil переменной интерфейса, интерфейс становится не-nil, потому что он хранит и тип, и значение. Посмотри на этот пример:
type MyInterface interface{}
var i MyInterface
var m map[string]int
i = m // m это nil, но i это НЕ nil
Хоть m и является nil, переменная i теперь содержит информацию о типе (map[string]int) и nil значение. Простая проверка if i == nil не сработает, что приведёт к неожиданному поведению.
i == nil) вернут false даже когда базовое значение равно nilИспользуй тайп-ассершн с дополнительной проверкой на nil:
if v, ok := i.(map[string]int); ok && v != nil {
fmt.Printf("value not nil: %v\n", v)
}
Этот подход:
.(type) assertionok) и значение не nilВсегда выполняй явные проверки на nil для базового значения после тайп-ассершна, вместо того чтобы полагаться на сравнение с nil на уровне интерфейса. Это гарантирует, что твой код правильно обрабатывает все граничные случаи.
Переменная интерфейса, содержащая значение типа nil, всегда вернёт true при прямом сравнении с nil с помощью оператора ==.
Новый — ещё не проверен сообществом
Вы