ProghubPH
rootroot2.05.20 09:14

Утечка ресурсов из-за отложенных вызовов функций в Go

golang

Очень большой стек отложенных вызовов также может занимать много памяти, а невыполненные отложенные вызовы могут препятствовать своевременному освобождению ресурсов. Например, если во время вызова функции необходимо обработать много файлов, большое количество обработчиков файлов не будет освобождено до выхода из функции.

func writeManyFiles(files []File) error {
	for _, file := range files {
		f, err := os.Open(file.path)
		if err != nil {
			return err
		}
		defer f.Close()

		_, err = f.WriteString(file.content)
		if err != nil {
			return err
		}

		err = f.Sync()
		if err != nil {
			return err
		}
	}

	return nil
}

В таких случаях мы можем использовать анонимную функцию для включения отложенных вызовов, чтобы вызовы отложенной функции выполнялись раньше. Например, вышеуказанная функция может быть переписана и улучшена.

func writeManyFiles(files []File) error {
	for _, file := range files {
		if err := func() error {
			f, err := os.Open(file.path)
			if err != nil {
				return err
			}
			// Метод Close будет вызываться
			// при завершении текущей итерации цикла.
			defer f.Close()

			_, err = f.WriteString(file.content)
			if err != nil {
				return err
			}

			return f.Sync()
		}(); err != nil {
			return err
		}
	}

	return nil
}