Почему эти две ошибки не равны - PullRequest
0 голосов
/ 03 апреля 2020

Я создаю ошибку в своем пакете и сравниваю ее с io.EOF, но операнд == имеет значение false. Но их тип и значение одинаковы? Почему == операнд возвращает false?

func TestErr(t *testing.T) {
    err := errors.New("EOF")
    t.Log(err == io.EOF)
    t.Logf("io err:%T,%v,%p", io.EOF, io.EOF, io.EOF)
    t.Logf("my err:%T,%v,%p", err, err, err)
}

Эти две ошибки не равны, потому что их указатели не равны

1 Ответ

4 голосов
/ 03 апреля 2020

error - это интерфейс. Содержит указатель на базовое значение. io.EOF создается:

var EOF = errors.New("EOF")

Если вы посмотрите на errors.New:

func New(text string) error {
    return &errorString{text}
}

type errorString struct {
    s string
}

Итак, io.EOF указывает на экземпляр структуры errorString, и созданная вами ошибка также указывает на экземпляр структуры errorString с тем же строковым значением, но два указателя не совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...