垃圾收集是否会在使用前将指针释放到包级变量中?

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


// 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 指针最终会指向任何地方?


达令说
浏览 61回答 1
1回答

HUH函数

如果您创建一个指向某个值的指针,取消对该指针的引用将产生该值。这就是您必须牢记的全部内容。垃圾收集系统可能正在做它在幕后做的任何事情,但上面的说法必须仍然成立。如果垃圾收集器在您使用它们之前使您的指针无效,那将是该语言的错误实现(即编译器错误)。当对 Go 的工作原理有疑问时,请始终查阅Go 语言规范。您会看到指针行为是明确定义的。另一方面,垃圾收集仅在介绍中提及,而没有定义任何行为。因此,我们可以假设垃圾收集不应覆盖或以其他方式干扰指针的工作方式。
打开App,查看更多内容
随时随地看视频慕课网APP