As I recall, Tom Szymanski asked for the rules about when one
goroutine would see changes made by another goroutine, and how that
related to channel operations. Russ Cox described what he thought
should happen, Tom encouraged him to write that down, and Russ did,
winding up with
https://go.googlesource.com/go/+/82c38cf8dd628e6c90b6f1160be2a8d5088b77c9/doc/mem.html
(when reading that doc, remember that it was written in February,
2009, and that the syntax has changed since then).
The "completes" is intentional. A send/receive on an unbuffered
channel was always intended to serve as a synchronization point
between the goroutines. Otherwise it would be hard for different
goroutines to synchronize on anything.
Ian