serex
serex

Reputation: 11

What "number of bytes written" should my io.Writer return when it intentionally does not write all the bytes it is passed

I want to create a struct that implements io.Writer, ie Write(p []byte) (n int, err error). The struct will omit certain bytes that is passed to it and thus not actually write all the bytes that is passed in the p parameter. (The actual purpose isn't important, but it could for example be to ignore the first 10 bytes written, ignore every second byte or something else that alters the number of bytes written from what the caller passed to the method).

The documentation for io.Writer's Write method says the following (emphasis mine):

Write writes len(p) bytes from p to the underlying data stream. It returns the number of bytes written from p (0 <= n <= len(p)) and any error encountered that caused the write to stop early. Write must return a non-nil error if it returns n < len(p). Write must not modify the slice data, even temporarily.

What should I return as the n value? To comply with the documentation, on success I should return len(p). However, the method might actually not have written that many bytes, and the return value will be "wrong".

Upvotes: 0

Views: 2050

Answers (1)

vastlysuperiorman
vastlysuperiorman

Reputation: 1784

On success, return len(p).

The function called when you write to /dev/null returns the number of bytes that you tried to "write" to it. It never actually writes anything, but it properly handles data being sent to it.

I would assume that in your case, you should only return n < len(p) if your writer was unable to properly handle all of the bytes sent to it.

Then, the documentation for your writer should very clearly state what data is and is not written. People using your function need to know what data will be retrievable after the write is finished.

Upvotes: 4

Related Questions