在 Go 專案讀取 .env 環境變數

做法

方法一

安裝 joho/godotenv 套件。

1
go get github.com/joho/godotenv

新增 .env 檔:

1
APP_ENV=local

使用 godotenv.Load() 方法,將 .env 檔載入,並使用 os.Getenv() 方法獲取環境變數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"fmt"
"log"
"os"

"github.com/joho/godotenv"
)

func init() {
if err := godotenv.Load(); err != nil {
log.Fatal("Missing .env file.")
}
}

func main() {
fmt.Println(isLocal())
}

func isLocal() string {
return os.Getenv("APP_ENV")
}
  • 此方法會檢查 .env 檔是否存在。

或使用底線「_」初始化 autoload 包,並直接使用 os.Getenv() 方法獲取環境變數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
"os"

_ "github.com/joho/godotenv/autoload" // initialize
)

func main() {
fmt.Println(isLocal())
}

func isLocal() string {
return os.Getenv("APP_ENV")
}
  • 此方法不會檢查 .env 檔是否存在。

可以建立一個 GetEnv() 函式,在獲取不到指定的環境變數時提示警告。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
"fmt"
"log"
"os"

_ "github.com/joho/godotenv/autoload" // initialize
)

func main() {
fmt.Println(GetEnv("APP_ENV"))
}

// GetEnv func
func GetEnv(name string) string {
env := os.Getenv(name)

if env == "" {
log.Printf("Environment variable not found: \"%s\".", name)
}

return env
}

方法二

安裝 spf13/viper 套件。

1
go get github.com/spf13/viper

新增 local.env 檔:

1
APP_ENV=local
  • .env 檔必須有名字,預設會尋找叫做 config.env 的環境變數檔。

將環境變數檔的路徑載入後,使用 viper.Get() 方法獲取環境變數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"github.com/spf13/viper"
"log"
)

func init() {
viper.AddConfigPath("./")
viper.SetConfigName("local")
if err := viper.ReadInConfig(); err != nil {
log.Fatalln(err.Error())
}
}

func main() {
log.Print(viper.Get("APP_ENV"))
}