一尘不染

默认情况下,哪些对象在Go中完成了,它有哪些陷阱?

go

该函数[runtime.SetFinalizer](http://golang.org/pkg/runtime/#SetFinalizer)(x, f interface{})将与关联的终结器设置xf

默认情况下会终结哪种对象?

默认情况下终结那些对象会导致哪些意外陷阱?


阅读 272

收藏
2020-07-02

共1个答案

一尘不染

默认情况下,完成以下对象:

  • os。File:当对象被垃圾回收时,文件自动关闭。

  • os。流程:完成将释放与流程相关的任何资源。在Unix上,这是空操作。在Windows上,它关闭与进程关联的句柄。

  • 在Windows上,程序包似乎[net](http://golang.org/pkg/net/)可以自动关闭网络连接。

除了上述对象之外,Go标准库未在对象类型上设置终结器。

似乎只有一个潜在的问题可能会在实际程序中引起问题:当an
os.File完成时,它将调用OS以关闭文件描述符。如果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
2020-07-02