VGrabko
@VGrabko
Golang, Php, Js

Почему изменилось поведение if?

func ErrKeyNotExists() error {
	return errors.New("key not exists")
}

if ErrKeyNotExists() == ErrKeyNotExists() {
	log.Println("ok")
} else {
	log.Println("err")
}

Почему возвращает "err"? У меня в коде много таких функций и после обновления к 1.7 всё сломалось.

UPD.
Из-за того что errors возвращает ссылку то if смотрит одинаков ли адрес, а не значение.
Проверил вот таким кодом
q := 1
w := 1
if &q == &w {
	log.Println("ok")
} else {
	log.Println("err")
}

Как заставить if сравнивать значение?
  • Вопрос задан
  • 197 просмотров
Решения вопроса 3
if ErrKeyNotExists().Error() == ErrKeyNotExists().Error() {

Если может возвращаться nil, то нужно доп проверки делать.
Ответ написан
Комментировать
bitver
@bitver
Вообще надо делать проверку на != nil.
Если нужно классифицировать ошибки, то лучше создать свои структуры ошибок и проверять на type.
Ответ написан
@ivahaev
Программист, связист и просто хороший человек
Тут не поведение `if` поменялось. С ним всё правильно. Функция каждый раз возвращает указатель на новую, хоть и идентичную конструкцию. Само собой, при сравнении адресов, они оказываются разными. И не нужно сравнивать текст ошибок. Правильно написали – вынести типовые ошибки в константы, из функций возвращать типовую ошибку и сравнивать с ними же.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы