По порядку будут выведены true, true, false, false, true. Различайте nil-интерфейс, типизированный nil внутри него и обычный nil-указатель.
Сравнение возвращаемых ошибок с nil
По порядку будут выведены true, true, false, false, true. Различайте nil-интерфейс, типизированный nil внутри него и обычный nil-указатель.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Исследуйте, как функции, возвращающие различные типы ошибок, сравниваются с nil, и предскажите, какие значения будут напечатаны в консоли.
package main
import (
"fmt"
)
type MyErr struct{}
func (me MyErr) Error() string {
return "my err string"
}
func main() {
fmt.Println(returnError() == nil)
fmt.Println(returnErrorPtr() == nil)
fmt.Println(returnCustomError() == nil)
fmt.Println(returnCustomErrorPtr() == nil)
fmt.Println(returnMyError() == nil)
}
func returnError() error {
var err error
return err
}
func returnErrorPtr() *error {
var err *error
return err
}
func returnCustomError() error {
var customErr MyErr
return customErr
}
func returnCustomErrorPtr() error {
var customErr *MyErr
return customErr
}
func returnMyError() *MyErr {
return nil
}
``
Ответ
По порядку будут выведены true, true, false, false, true. Различайте nil-интерфейс, типизированный nil внутри него и обычный nil-указатель.
returnError возвращает пустой error, а returnErrorPtr — nil-указатель на интерфейс: оба равны nil. returnCustomError упаковывает значение MyErr в интерфейс, поэтому результат не nil.
returnCustomErrorPtr возвращает error с типом *MyErr и nil-значением — тоже не nil. Последняя функция возвращает сам *MyErr без упаковки, и её nil непосредственно равен nil. Методы Error здесь не вызываются; сравнение не разыменовывает указатели.