По умолчанию финализируются следующие объекты:
os. Файл : файл автоматически закрывается при сборке мусора.
os. Процесс : Финализация освободит все ресурсы, связанные с процессом.В Unix это не операция.В Windows закрывается дескриптор, связанный с процессом.
В Windows выясняется, что пакет <a href="http://golang.org/pkg/net/" rel="noreferrer">net</a>
может автоматически закрывать сетевое соединение.
Стандартная библиотека Go не устанавливает финализатор для типов объектов, отличных от упомянутых выше.
Кажется, есть только одна потенциальная проблема, которая может вызвать проблемы в реальных программах: когда os.File
после завершения он вызовет ОС, чтобы закрыть дескриптор файла.Если os.File
был создан путем вызова функции os.NewFile(fd int, name string) *File
и дескриптор файла также используется другим (другим) os.File
, то сборщик мусора либо один из объектов файла отобразит другойФайловый объект непригоден для использования.Например:
package main
import (
"fmt"
"os"
"runtime"
)
func open() {
os.NewFile(1, "stdout")
}
func main() {
open()
// Force finalization of unreachable objects
_ = make([]byte, 1e7)
runtime.GC()
_, err := fmt.Println("some text") // Print something via os.Stdout
if err != nil {
fmt.Fprintln(os.Stderr, "could not print the text")
}
}
отпечатков:
could not print the text