In go the implication is that the object follows reference semantics. Whether it is stored on the stack or the heap is handled by the compiler. This is also why you can take the address of things that would normally be stack values in C.

When you marshal a pointer the underlying data type is marshalled. In fact you have to unmarshal into a value type object.

http://golang.org/pkg/encoding/json/#Marshal
http://golang.org/pkg/encoding/json/#Unmarshal

See previous answer to where the memory is. You don't actually have to worry about it unless you are trying to optimize it. Its probably on the heap though.

Go has a precise garbage collector so nothing is bound to function scope, although sometimes you will have data races if you end up with multiple go routines running in the same function scope.

Yes.

When you marshal the block you get a json encoded form of the block. When you unmarshal it you get the "original" block back. (identical although I think the heartbeat being pointed to is a different but identical copy)