Now I am confused.

When you store a pointer to something, the implication is that the actual object is stored somewhere else, perhaps in dynamic memory (or perhaps just within some other scope).

What happens when you marshal a pointer?

And, if the heartbeats are not stored in the block, where is the memory? Is it just out in the heap, or is it within the scope of the function that unmarshaled it?

I suppose what happens is a function unmarshals it, and then the block struct points to the place in memory where it was stored when it was unmarshaled. Then go handles garbage collection and we stop worrying about it.

Just as long as when we marshal the block we get a heartbeat and not a heartbeat pointer.