2 回答

TA貢獻1796條經驗 獲得超4個贊
看起來你正在做這樣的事情(游樂場):
var (
env = make(map[string]string) // Simulated environoment
password = env["DATABASE_PWD"]
)
func init() {
// Simulate loading .env file (godotenv.Load())
env["DATABASE_PWD"] = "foo"
}
func main() {
fmt.Println(password) // Outputs a blank line
fmt.Println(env["DATABASE_PWD"]) // Outputs "foo"
}
這將不起作用,因為變量在init
運行之前已初始化;這是按照規范:
一個沒有導入的包是通過為它的所有包級變量分配初始值,然后按照它們在源代碼中出現的順序調用所有 init 函數來初始化的,可能在多個文件中,如呈現給編譯器。如果一個包有導入,導入的包在初始化包本身之前被初始化......
所以 的值是在運行password
之前設置的(這意味著密碼將是您啟動應用程序時環境中的任何值 - 可能為空)。godotenv.Load()
您可以通過在運行后加載環境變量來解決此問題godotenv.Load()
。我建議這樣做,main
以便您可以處理任何錯誤(godotenv.Load()
可能會失?。。?。請參閱包 repo 中的示例。
注意:這就是為什么包含一個最小的、可重現的示例很重要的原因。創建這樣的示例時,您可能會注意到它password
是空的,并且問題與database/sql
. 如果沒有比問題中提供的更多信息,則無法回答該問題。

TA貢獻1808條經驗 獲得超4個贊
為什么您的解決方案無法按預期工作
我想你誤解了 os.GetEnv() 函數的作用,你的操作系統有一些叫做環境變量的東西,這就是你想要達到的目的。
您的代碼返回一個空字符串,因為它未設置為環境變量。
您可以查看以下位置以了解有關此功能及其工作原理的更多信息:
你想做什么
現在請允許我解釋一下您想實際做什么,您想從文件中獲取這些變量,因此您需要:
告訴程序它在哪里
打開它
解析它
讀取值
您可以通過兩種方式做到這一點。
第一個解決方案(自己動手)
首先打開文件并將其內容傳遞給掃描儀。然后,您遍歷每一行并使用“=”字符(Env 格式)將該行分成兩部分,最后將其鍵/值存儲在地圖之類的東西中(或您想要/需要的任何東西)。
第二個解決方案(對于懶惰的開發或復雜的項目)
第二,如果你不想做所有這些,只需使用配置庫或解析器為你做。
這是使用 Viper 執行此操作的鏈接: Load config from file & environment variables in Golang with Viper
- 2 回答
- 0 關注
- 139 瀏覽
添加回答
舉報