The word "channel" doesn't appear a single time in the article, even though goroutines without channels to communicate with each other should never be sharing data. Channels are the synchronization primitive in Go.
Instead of sharing the file descriptor across a goroutine (bro, like WTF), let one go routine manage the file descriptor itself.