我有一個配置物件,它在啟動時根據環境變數初始化一些變數:
// 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 指標最終會指向無處?
uj5u.com熱心網友回復:
如果您創建一個指向值的指標,則取消參考該指標將產生該值。
這就是您必須牢記的全部內容。垃圾收集系統可能正在做它在幕后所做的任何事情,但上述陳述必須仍然正確。如果垃圾收集器在您使用它們之前使您的指標無效,那將是該語言的錯誤實作(即編譯器錯誤)。
如果對 Go 的作業方式有疑問,請始終查閱Go 語言規范。您會看到指標行為是明確定義的。另一方面,垃圾收集只在介紹中提到,沒有定義任何行為。因此,我們可以假設垃圾收集不應覆寫或以其他方式干擾指標的作業方式。
uj5u.com熱心網友回復:
您的變數gConf是包全域變數(對其他包不可見)。
全域變數是指在函式外部定義的變數。
全域變數在程式的整個生命周期中都保持其值。
如果您在代碼的任何部分更改了值所a參考的de 值,并且該值仍然被取消參考,則取消參考的值將被垃圾收集,但不會(被 參考)。gConfbaabgConf
所以簡而言之你的問題:不,除非你明確地改變它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493268.html
