Too Long; Didn't Read
The interface should set its semantics, not the implementer as a static type. The interface is not intuitive, complete, and idiomatic because of missing the error distinction. It exits too early when it returns data and together, which is allowed for allimplementers. There are many other examples in the standard library itself where callers of the ioReader interface misuse it. Go's standard library and especially its tests are tight to the requirements of the Go standard library. The language itself that you implement or misuse them should not need to be able to do it.