+1

I’d love to hear more about the motivation behind the io.EOF as an error. 
And why select a strategy to prefer *no* *discriminated unions* for the 
error results? Why transport non-error information in error values (io.EOF, 
'http.ErrServerClosed)?

“Normal” vs. “error” [control flow] is a fundamental semantic distinction, 
and probably the most important distinction in any programming language - 
Herb Shutter

The io.Reader has caused many problems during its existence. Even so, the os 
packages official documentation <https://pkg.go.dev/os> and the File.Read 
example starts with a potential bug and incorrect io.Reader usage. Should 
the if clause be:
if err != nil && err != io.EOF { ... 

The issue #21852 <https://github.com/golang/go/issues/21852> gives an 
excellent overall picture of how deep unintuitive io.EOF usage can affect 
Go’s code and test base. It includes an interesting comment that maybe Go 2 
will fix the io.Reader. Now it’s official that there will never be Go 2, 
maybe io.Reader2?
​
On Wednesday, March 20, 2024 at 6:39:29 AM UTC+2 Nigel Tao wrote:

> On Wed, Mar 20, 2024 at 2:13 PM Ian Lance Taylor <ia...@golang.org> wrote:
> > Some earlier discussions:
> >
> > https://groups.google.com/g/golang-nuts/c/b78eRMOS0FA/m/jq8lAQhenaoJ
> > https://groups.google.com/g/golang-nuts/c/WGYJx3ICCW4/m/1L0WcN8eqmkJ
> >
> > See in particular this message from Russ:
> > https://groups.google.com/g/golang-nuts/c/b78eRMOS0FA/m/sbbgr9MUo9QJ
>
> Russ said:
>
> > Once in a while we think about changing the definition
> > to require n==0 when err==EOF but it doesn't help the
> > more general case, a partial read that returns an error
> > saying why more data wasn't returned (disk error, etc).
>
> OK, partial reads are a thing, but one possible design (in hindsight,
> not now) was to push the complexity in tracking that into Read
> callees, not Read callers. Instead of a callee returning (positiveN,
> nonNilErr), have it save nonNilErr to a struct field and return (0,
> nonNilErr) on the next Read call.
>
> I'd expect fewer programmers writing callees than callers, and they'd
> generally be more experienced Go programmers. Anecdotally, when I was
> doing a lot of Go code reviews some years ago, I'd often have to point
> out the "Callers should always process the n > 0 bytes returned before
> considering the error err" comment, often to the programmer's
> surprise.
>
> While it's relatively easy, *if you already know*, to do this:
>
> n, err := r.Read(buffer)
> doStuffWith(buffer[:n])
> if err != nil {
> return err
> }
>
> instead of this:
>
> n, err := r.Read(buffer)
> if err != nil {
> return err
> }
> doStuffWith(buffer[:n])
>
> it's not really obvious if you don't know that you don't know. And
> sometimes doStuffWith is more than just "something += n". If
> doStuffWith can itself lead to further errors (e.g. you're parsing the
> bytes you've just read), you also have to be careful not to clobber
> the err variable.
>
> Anyway, it's far too late to change it. I was just wondering if there
> was some motivating reason that I'd otherwise missed.
>

-- 
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 golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/3f26b58e-b451-4fdd-b0b8-17638a30ce4en%40googlegroups.com.

Reply via email to