登录
首页 >  Golang >  Go问答

在使用包级变量之前,垃圾回收是否会释放存储在包级变量中的指针?

来源:stackoverflow

时间:2024-03-14 19:26:06 475浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《在使用包级变量之前,垃圾回收是否会释放存储在包级变量中的指针?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我有一个配置对象,它在启动时根据环境变量初始化一些变量:

// init the conf object on startup and fail quickly if there's an environment issue
_ = utils.getconf()

这是在我的服务器的 init() 方法中,在我的代码中的其他地方,我只是调用 getconf() 来获取配置对象。我想通过单例模式实现这个配置对象:

import (
    "fmt"

    env "github.com/Netflix/go-env"
)

type Conf struct {
    DBName        string `env:"MONGO_INITDB_DATABASE,required=true"`
    Hostname      string `env:"HOSTNAME,required=true"`
    DBUsername    string `env:"MONGO_INITDB_ROOT_USERNAME,required=true"`
    DBPassword    string `env:"MONGO_INITDB_ROOT_PASSWORD,required=true"`
}

var gConf *Conf

func GetConf() *Conf {
    if gConf != nil {
        return gConf
    }
    gConf = new(Conf)
    _, err := env.UnmarshalFromEnviron(gConf)
    if err != nil {
        panic(err)
    }
    return gConf
}

由于我一开始没有对 utils.getconf() 的返回值做任何事情,golang 是否有可能垃圾收集我的配置对象,而我的 gconf 指针最终会指向任何地方?


正确答案


如果您创建一个指向某个值的指针,则取消引用该指针将产生该值。

这确实是您必须牢记的。垃圾收集系统可能正在幕后做任何事情,但上述陈述仍然必须成立。如果垃圾收集器在您使用指针之前使它们无效,那么这将是该语言的一个损坏的实现(即编译器错误)。

当对 Go 的工作原理有疑问时,请务必查阅 Go language specification。您会看到 pointer behaviour 已明确定义。另一方面,垃圾收集仅在简介中提到,而没有定义任何行为。因此,我们可以假设垃圾收集不应覆盖或以其他方式干扰指针的工作方式。

以上就是《在使用包级变量之前,垃圾回收是否会释放存储在包级变量中的指针?》的详细内容,更多关于的资料请关注golang学习网公众号!

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