1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Goの環境変数読み出しについて

Last updated at Posted at 2022-02-18

環境変数をセットする際に、いくつかパターンがあるなと思ったのでまとめます。

基本

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

今のお気に入り:tea:

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)
		}
	}
}

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?