環境変数をセットする際に、いくつかパターンがあるなと思ったのでまとめます。
基本
basicEnv.go
package main
import (
"os"
"fmt"
)
func main() {
os.Setenv("ENV", "debug")
env := os.Getenv("ENV")
fmt.Println(env)
}
joho/godotenv
.env
ENV=debug
dotEnv.go
package main
import (
"os"
"fmt"
"log"
dotenv "github.com/joho/godotenv"
)
func main() {
if err := dotenv.Load(); err != nil {
log.Fatalln(err)
}
env := os.Getenv("ENV")
fmt.Println(env)
}
ini
config.ini
[dev]
ENV=debug
ini.go
package main
import (
"fmt"
"log"
"gopkg.in/ini.v1"
)
// ConfigList is ...
type ConfigList struct {
ENV string
}
func main() {
config, err := ini.Load("config.ini")
if err != nil {
log.Fatalf("config.iniの読み込み失敗:%v", err)
}
cfg = ConfigList{
ENV: config.Section("dev").Key("ENV").MustString(""),
}
fmt.Println(cfg.ENV)
}
caarlos0/env
今のお気に入り
bash
$ echo $ENV
debug
package main
import (
"log"
"fmt"
"github.com/caarlos0/env"
)
type ServerConfig struct {
Env string `env:"ENV,required"`
}
func main() {
var config ServerConfig
if err := env.Parse(&config); err != nil {
log.Fatalln(err)
}
fmt.Println(config.Env)
}
おまけ
環境変数読み出しの失敗テストの時に、ポインタで格納している。
コンストラクタを用意していないので、前の同じ値が参照される。
アドレスの削除が必要になった。
という状況で、os.Clearenv()
を使うことで打開した。
config.go
package config
import (
"github.com/caarlos0/env"
)
type ServerConfig struct {
Env string `env:"ENV,required"`
GinMode string `env:"GIN_MODE,required"`
Port string `env:"PORT,required"`
}
// Load 環境変数を読み出す
func Load() (*ServerConfig, error) {
var config ServerConfig
if err := env.Parse(&config); err != nil {
return nil, err
}
return &config, nil
}
config_test.go
// TestLoad_Failed 失敗: 環境変数読み出しテスト
func TestLoad_Failed(t *testing.T) {
var err error
cases := []struct {
env string
mode string
port string
}{
{mode: "debug_failed", port: "4000"},
{env: "YOUR_ENV_failed", port: "5000"},
{mode: "debug_failed_2"},
}
for _, c := range cases {
// テスト前に、環境変数を削除しておく
os.Clearenv()
if c.env != "" {
if err = os.Setenv("ENV", c.env); err != nil {
t.Fatalf("環境変数のセットに失敗しました。\n詳細: %v", err)
}
}
if c.mode != "" {
if err = os.Setenv("GIN_MODE", c.mode); err != nil {
t.Fatalf("環境変数のセットに失敗しました。\n詳細: %v", err)
}
}
if c.port != "" {
if err = os.Setenv("PORT", c.port); err != nil {
t.Fatalf("環境変数のセットに失敗しました。\n詳細: %v", err)
}
}
scfg, err := config.Load()
if scfg != nil || err == nil {
t.Fatalf("環境変数の読み出しに失敗しました。\n詳細: %v", err)
}
}
}