登录
首页 >  Golang >  Go问答

在 Go 中哪些对象是默认完成的,它有哪些陷阱?

来源:Golang技术栈

时间:2023-04-06 10:43:08 170浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《在 Go 中哪些对象是默认完成的,它有哪些陷阱?》,聊聊golang,希望可以帮助到正在努力赚钱的你。

问题内容

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

默认情况下最终确定了哪些对象?

默认情况下完成这些对象会导致哪些意外陷阱?

正确答案

以下对象默认完成:

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

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

  • 在 Windows 上,该软件包似乎net可以自动关闭网络连接。

Go 标准库没有对上述对象类型以外的对象类型设置终结器。

在实际程序中似乎只有一个潜在问题可能会导致问题:当 anos.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

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>