Вывод: true, false, false, false — по одному значению на строке. Только err1 является действительно nil-интерфейсом.
Какой будет вывод функции checkErr в main
Вывод: true, false, false, false — по одному значению на строке. Только err1 является действительно nil-интерфейсом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какие булевые значения напечатает функция checkErr при разных вызовах из main.
import (
"fmt"
)
type errorString struct {
s string
}
func (e errorString) Error() string {
return e.s
}
func checkErr(err error) {
fmt.Println(err == nil)
}
func main() {
var err1 error
checkErr(err1)
var errPtr *errorString
checkErr(errPtr)
errPtr = &errorString{}
checkErr(errPtr)
errPtr = nil
checkErr(errPtr)
}
Ответ
Вывод: true, false, false, false — по одному значению на строке. Только err1 является действительно nil-интерфейсом.
При передаче errPtr в checkErr интерфейс получает динамический тип *errorString, даже если значение указателя nil. После повторного присваивания nil указателю этот тип при следующей упаковке не исчезает. Метод Error здесь не вызывается, поэтому nil-указатель не разыменовывается. Nil-интерфейс не содержит ни динамического типа, ни значения.