The ubiquitous io.Reader interface's Read method returns a (int,
error). Surprisingly (for programmers coming from other languages with
a built-in or idiomatic Result<T, E> type), it's possible for both
return values to be non-zero. There's (often overlooked??) commentary
in https://pkg.go.dev/io#Reader that says:
> Callers should always process the n > 0 bytes returned before considering the
> error err.
So that (again, especially for programmers used to saying result? or
"try result" or similar Result<T, E> aware mechanisms in other
languages), the following Go code is incorrect:
n, err := r.Read(buffer, etc)
if err != nil {
return err
}
doStuffWith(buffer[:n])
---
Do any of the early Gophers remember the motivations for designing
Read's semantics in that way? At the libc or syscall level (and my
reading of FD.Read in internal/poll/fd_unix.go), I don't think
read(fd, etc) can return both non-zero.
Is it just that, if you've got a buffer of some sort (including the
compress/* packages), it can be more efficient (1 Read call instead of
2) to return (positiveN, io.EOF)?
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/CAOeFMNW2QyVYUHDAOLNYOS3FoOEOxi-UE5jo_KEq4c2_UN6-ow%40mail.gmail.com.