Эквивалент Java финализировать метод - PullRequest
7 голосов
/ 09 января 2011

Есть ли какой-либо метод, как финализация Java в Go?Если у меня есть структура типа, подобная

    type Foo struct {
        f *os.File
        ....
    }

func (p *Foo) finalize() {
     p.f.close( )           
}

Как я могу убедиться, что, когда Object собирает мусор, файл закрывается?

Ответы [ 2 ]

16 голосов
/ 09 января 2011

Вы бы не сделали этого в Java, либо.Правильно сделать в java блок finally, закрывающий его где-то рядом с тем местом, где вы открывались.

Для очистки вы бы использовали аналогичный паттерн с функцией defer,Например, если вы сделали это (Java):

try {
  open();
  // do stuff
} finally {
  close();
}

На ходу, вы бы сделали это:

open();
defer close();
// do stuff
7 голосов
/ 09 января 2011

runtime.SetFinalizer IIRC. Но это считается плохой вещью и не гарантированно запускается до выхода из программы

РЕДАКТИРОВАТЬ: Как упоминалось ниже, текущий пакет os уже вызывает runtime.SetFinalizer для файлов. Однако на SetFinalizer не следует полагаться. В качестве примера того, почему у меня было приложение, похожее на файловый сервер, где я забыл закрыть открытый файл. Обычно процесс получает около 300 открытых файлов, прежде чем GC подберет их и вызовет их финализатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...