It is not ok to read some memory location (grabbing the data) while another goroutine is writing to the same memory location (editing the entities).
Also, it is not ok if two goroutines simultaneously write to the same memory location.
These are called "data races" and are bad, because, for example, the result of reading some memory while another thread is modifying it
is undefined.
The race detector is a tool that detects this kind of bugs. You turn it on by doing go run, build or test with the -race flag.
By the way, it is ok if multiple goroutines read from the same memory location, if no one is modifying the data.
When using multiple goroutines you typically have two options:
1) using shared data structures (your Entity map) and synchronize access with mutexes.
2) avoid shared data structures and have the goroutines communicate with channels.
Of course you can mix those things.
Note that these are issues that arise in any language with multithreaded programming, not just Go.
Go has been designed with concurrency in mind and has better tools than, for example, Java or C,
but concurrent programming is not trivial and you should know what you are doing.
Look for tutorials on the matter.
In your case, it would be ok, for example, if you could split your set of entities in multiple subsets and
assign each subset to a different goroutine. The goroutines would work in parallel, but each one would mind it's own business
(not mess with data belonging to the others).