If bufio.Writer.Flush() ever sees an error, it sets b.err and will immediately return that error on any future calls to Flush: https://golang.org/src/bufio/bufio.go?s=14569:14599#L558
Writer.Reset(w io.Writer) will clear the error and set the bufio.Writer to use the new io.Writer given, but it also *resets the buffer pointer to 0*, losing pending data. Suppose I have a bufio.Writer wrapping a network connection. If I e.g. switch from WiFi to an ethernet connection on my laptop, Flush will return an error and thereafter refuse to write to that connection. I can re-establish the connection and call Writer.Reset with the new connection, but I will lose any pending data. At bufio.go:580, Flush's error-handling code seems to be updating b.buf and b.n as if they might be used later, but a quick look through the code shows that if b.err is ever set, b.buf will never be written to the io.Writer. The same applies if you've set a WriteDeadline on your connection; the connection itself may in fact be completely fine, but temporary network conditions meant you couldn't meet the deadline. The bufio.Writer, though, is broken if it misses a deadline. What's the right way to handle this? Write our own bufio that lets us reset the error and io.Writer while preserving unwritten data? Thanks, John -- 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. For more options, visit https://groups.google.com/d/optout.