Description
I find myself constantly needing to look up the documentation for io
and io/ioutil
to figure out which package contains the thing I want to use.
The root of the problem is that ioutil
isn't a coherent abstraction boundary. The suffix util
doesn't add any information — if a package has no utility, it should not exist! — and the remaining information in the package name doesn't distinguish it from io
. (See also the "Bad package names" section of https://blog.golang.org/package-names.)
From what I can tell, the main purpose of separating out ioutil
is to reduce the dependencies of io
: specifically, the dependencies on bytes
, os
, and sort
.
In a potential Go 2, I propose to resolve those dependencies by refactoring the ioutil
package as follows:
-
Move
Discard
,NopCloser
, andReadAll
into packageio
:NopCloser
has no dependencies.Discard
depends onsync
, whichio
already depends on.ReadAll
uses abytes.Buffer
internally, but doesn't actually need very much of its API; it can be rewritten easily to avoid that dependency.
-
Move
ReadDir
,ReadFile
,TempDir
,TempFile
, andWriteFile
to a new package,io/fileio
.- Rename them to omit the (now-redundant)
File
suffix:fileio.Read
instead ofioutil.ReadFile
.
- Rename them to omit the (now-redundant)