I don't see any reason why that program should need runtime.KeepAlive.
The local variable sh will point to data (aka ds), so the object will
stay alive. This is not different than p := &data. After that point,
if data is no longer mentioned, then the variable data is no longer
live, but the value that p points to will remain alive.
Ian