First, let me say that it's best to avoid the word "atomic" without
clearly explaining what you mean, as it has many different meanings
and implications. In this case I think what you mean is that in Go an
assignment made by one goroutine may be interleaved with an assignment
made by a different goroutine. Or, more precisely, you mean that a
goroutine may be interrupted in the middle of doing an assignment,
such that another goroutine may observe the assignment as started but
not fully completed.
Technically, I think you are correct: I don't know of anything in the
Go language spec that prohibits a goroutine from being interrupted
while partway through the assignment to hdr.Data. But then the Go
language spec doesn't discuss stack resizing at all.
In practice no Go implementation is going to interrupt an assignment
that is only a single memory word. And, of course, it would be
invalid for a Go implementation that does stack shrinking or garbage
collection to interrupt an assignment of a pointer value. And at the
machine level, on a modern processor, an assignment of a uintptr uses
the exact same instructions as an assignment of an unsafe.Pointer. So
I don't think there is anything to worry about here.
Ian