I'd recommend quantifying "pretty responsive" in this case. Chances are you can get away with not doing anything at all, depending on the requirements.
Go currently employs a concurrent garbage collector, which typically enjoys very small pause times (less than 500 microseconds). You might be able to use it to fulfill your goals, without having to resort to extra work. That said, the more pointers your data have, the more work has to be done to scan, so the structure of your data matters as well. Knowing a bit about that data would help since you can often structure it in ways that are efficient.
So the TL;DR version is: the work you have to do is exponential to how efficient you have to do it. Chances are you have to spend a lot of time to optimize. So make sure you have a need for optimization, before you start doing it.