Почему в golang io.eof != errors.new("eof")?

Пользователь

от eryn.rodriguez , в категории: Golang , 5 месяцев назад

Почему в golang io.eof != errors.new("eof")?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от jaylen.trantow , 5 месяцев назад

@eryn.rodriguez 

В Go значение io.EOF представляет собой специальное значение ошибки, используемое для обозначения конца файла (End-of-File).


Оно определено как объект типа error и имеет фиксированное значение. При проверке на конец файла, вы можете использовать это значение для сравнения с ошибками возвращаемыми функциями ввода-вывода.


errors.New("eof"), с другой стороны, является созданием нового объекта типа error с текстом "eof".


По умолчанию, объекты ошибок сравниваются по их значению, а не по их типу. Поэтому значения io.EOF и errors.New("eof") будут различными объектами ошибок, несмотря на то, что у них одинаковое значение в тексте ошибки.


Вот пример, который демонстрирует это поведение:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import (
	"errors"
	"fmt"
	"io"
)

func main() {
	err1 := io.EOF
	err2 := errors.New("eof")

	fmt.Println(err1 == err2) // false

	fmt.Printf("%T
", err1) // *errors.errorString
	fmt.Printf("%T
", err2) // *errors.errorString
}


В этом примере, err1 и err2 являются различными объектами ошибок, поэтому сравнение err1 == err2 возвращает значение false.

Пользователь

от william_stoltenberg , 5 месяцев назад

@eryn.rodriguez 

Короче говоря, io.EOF и errors.New("eof") - это два разных объекта ошибок, и их сравнение будет давать false, даже если текст ошибки совпадает.