Будет выведено val is not nil: интерфейс val содержит тип *int и nil-указатель, а не полностью пустой интерфейс.
Какой текст выведет программа в примере №10
Будет выведено val is not nil: интерфейс val содержит тип *int и nil-указатель, а не полностью пустой интерфейс.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод появится в консоли после выполнения следующей программы.
func main(){
var ptr *int
var val interface{}
val = ptr
if val == nil{
fmt.Println("val is nil")
return
}
fmt.Println("val is not nil")
}
Ответ
Будет выведено val is not nil: интерфейс val содержит тип *int и nil-указатель, а не полностью пустой интерфейс.
Присваивание val = ptr сохраняет динамический тип ptr. Равенство интерфейса nil требует отсутствия и типа, и значения.
Чтобы проверить именно указатель, сравните ptr с nil до упаковки либо выполните type assertion и проверьте полученный *int. Нельзя считать всякий ненулевой interface{} существующим объектом. Такая же особенность проявляется при возврате error, когда функция возвращает типизированный nil-указатель.