runtime.SetFinalizer(x, f), где x - указатель на объект (в случае локальной переменной, при взятии указателя, она будет аллоцирована на хипе), а f - функция, способная принять аргументом x (это может быть как variadic, так и generic функция). Когда garbage collector собирается очистить x, но видит, что для него есть финализатор - сначала вызывается финализатор в отдельной горутине (одна для всех финализаторов), сам же объект будет очищен при следующем вызове gc, если только финализатор завершил свою работуВызов финализатора не гарантирован, ведь программа может завершить свою работу ещё до того, как будет собран необходимый объём мусора
Если указатель на объект занимает 0 байт, то нет гарантий, что финализатор будет вызван. Также нет гарантий, что финализатор будет когда-либо вызван для объектов в package-level, так как они могут быть аллоцированы линкером, а не на хипе
Чтобы убрать финализатор объекта, достаточно установить финализатор в значение nil