Calvert's murmur

在 Go 讀寫環境變數

2021-09-14

約 2723 字 / 需 15 分鐘閱讀

原文:CalliCoderReading 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
Tags: Golang