原文:CalliCoder — Reading and Writing Environment Variables in Go
環境變數是在程式執行時向程式提供動態設定資訊的一種方式。環境變數通常用於讓同一個程式在不同的環境中運作,如本機、驗證或生產環境。
在 Go 取得、設定、取消設定和擴充環境變數
下面的程式示範了如何在 Go 中使用環境變數。它利用了 os
package 提供的以下功能:
- os.Setenv(key, value): 設定環境變數。
- os.Getenv(key): 取得環境變數。如果環境變數不存在,則返回空值。要區分空值和未設定的值,請使用 LookupEnv。
- os.Unsetenv(key): 取消設定環境變數。
- os.LookupEnv(key): 取得環境變數值和一個用來表示環境變數是否存在的布林值。它返回一個字串和布林值,如果環境變數不存在,布林值為 false。
- os.ExpandEnv(str): 根據目前的環境變數,取代字串中的
${var}
或$var
來擴充字串。
package main
import (
"fmt"
"os"
)
func main() {
// Set an Environment Variable
os.Setenv("DB_HOST", "localhost")
os.Setenv("DB_PORT", "5432")
os.Setenv("DB_USERNAME", "root")
os.Setenv("DB_PASSWORD", "admin")
os.Setenv("DB_NAME", "test")
// Get the value of an Environment Variable
host := os.Getenv("DB_HOST")
port := os.Getenv("DB_PORT")
fmt.Printf("Host: %s, Port: %s\n", host, port)
// Unset an Environment Variable
os.Unsetenv("DB_PORT")
fmt.Printf("After unset, Port: %s\n", os.Getenv("DB_PORT"))
/*
Get the value of an environment variable and a boolean indicating whether the
environment variable is present or not.
*/
driver, ok := os.LookupEnv("DB_DRIVER")
if !ok {
fmt.Println("DB_DRIVER is not present")
} else {
fmt.Printf("Driver: %s\n", driver)
}
// Expand a string containing environment variables in the form of $var or ${var}
dbURL := os.ExpandEnv("postgres://$DB_USERNAME:$DB_PASSWORD@DB_HOST:$DB_PORT/$DB_NAME")
fmt.Println("DB URL: ", dbURL)
}
# Output
Host: localhost, Port: 5432
After unset, Port:
DB_DRIVER is not present
DB URL: postgres://root:admin@DB_HOST:/test
列出並清除 Go 中的所有環境變數
- os.Environ(): 此函數以
key=value
的形式返回一個包含所有環境變數的[]string
。 - os.Clearenv(): 此函數會刪除所有環境變數。在撰寫測試要從乾淨的環境開始時可能會派上用場。
以下範例示範了如何使用這兩個函數:
package main
import (
"fmt"
"os"
"strings"
)
func main() {
// Environ returns a copy of strings representing the environment,
// in the form "key=value".
for _, env := range os.Environ() {
// env is
envPair := strings.SplitN(env, "=", 2)
key := envPair[0]
value := envPair[1]
fmt.Printf("%s : %s\n", key, value)
}
// Delete all environment variables
os.Clearenv()
fmt.Println("Number of environment variables: ", len(os.Environ()))
}
# Output
TERM_SESSION_ID : w0t0p1:70C49068-9C87-4032-9C9B-49FB6B86687B
PATH : /Users/callicoder/.nvm/versions/node/v10.0.0/bin:/usr/local/sbin:/usr/local/sbin:/Users/callicoder/protobuf/bin:/Users/callicoder/go/bin:/Users/callicoder/vaultproject:/Users/callicoder/google-cloud-sdk/bin:/Users/callicoder/.rbenv/bin:/Users/callicoder/.rbenv/shims:/Users/callicoder/anaconda3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/callicoder/Library/Android/sdk/platform-tools:/opt/flutter/bin
.... # Output truncated for brevity
Number of environment variables: 0