It’s best not to acquire a mutex and launch a goroutine to read 3 bytes of data at a time.
Also, hot tip: you can like… benchmark this. It’s not illegal.
io.Copy uses 32KB buffers. Other parts of standard library do too. If you're using Read() to read 3 bytes of data at a time, mutex is the least of your worries.
Since you seem to be ignoring sarcasm of my previous comment - just saying "don't do that" without suggesting an alternative way in the particular code context you're referring to, isn't useful at all. It's just annoying.
If you’re aborting specifically an io.Copy, then there are better ways to do that: abort in the write path rather than the read path.
It’s not my job to provide you with alternative code. That’s your job.
It is not your job to tell me "that is wrong", yet you do it because it's easy. Suggesting an alternative (not necessarily providing the code) is less easy, so you don't wanna do it. That's fine. I just want you to be aware that the former without the latter is pretty much useless.
Posting detailed instructions on how to identify, purchase and utilise a hammer isn’t something I need to do, and doesn’t negate the correctness of the initial “don’t do that”.