May not have been a "decision" at all. The simplest GC just needs to hijack malloc to keep track of allocations and every now and then scan the process memory for values that look like pointers into those allocations. Of course that is both slow and leaks bad enough that early Go versions had issues with 32bit address space.