runtime.SetFinalizer устанавливает функцию, вызываемую когда GC собирает объект. Но есть подвохи: порядок вызова не гарантирован, финализер может воскресить объект, финализированный объект освобождается только в следующем GC цикле. Один объект — один финализер. Финализеры бегут в отдельной горутине. Лучше использовать explicit Close() и defer.