You're correct that updating a map from multiple goroutines without synchronizing is unsafe. But the overhead of using a RWMutex (http://weekly.golang.org/pkg/sync/#RWMutex) in this case should be negligible compared to the I/O code.
The big win is that Go allows you to write straightforward concurrent code but under the hood uses high-performance system calls like epoll.
The big win is that Go allows you to write straightforward concurrent code but under the hood uses high-performance system calls like epoll.
EDIT: Here's a thread-safe version: https://github.com/jbarham/Key-Value-Polyglot/blob/master/me.... Still plenty fast.