Goプロジェクトで環境変数をConfigパッケージとして扱う
Go
package config
import (
"os"
"strconv"
)
type DatabaseConfig struct {
Host string
Name string
User string
Password string
Port string
}
type GoogleConfig struct {
ClientID string
ClientSecret string
RedirectURL string
}
type JwtConfig struct {
Secret string
AccessTokenDuration int
}
type Config struct {
Database DatabaseConfig
Google GoogleConfig
Jwt JwtConfig
}
func LoadConfig() (*Config, error) {
config := &Config{
Database: DatabaseConfig{
Host: getEnv("DB_HOST", ""),
Name: getEnv("DB_NAME", ""),
User: getEnv("DB_USER", ""),
Password: getEnv("DB_PASSWORD", ""),
Port: getEnv("DB_PORT", ""),
},
Google: GoogleConfig{
ClientID: getEnv("GOOGLE_CLIENT_ID", ""),
ClientSecret: getEnv("GOOGLE_CLIENT_SECRET", ""),
RedirectURL: getEnv("GOOGLE_REDIRECT_URL", ""),
},
Jwt: JwtConfig{
Secret: getEnv("JWT_SECRET", ""),
AccessTokenDuration: getEnvAsInt("JWT_ACCESS_TOKEN_DURATION", 0),
},
}
return config, nil
}
func getEnv(key, fallback string) string {
if value, ok := os.LookupEnv(key); ok {
return value
}
return fallback
}
func getEnvAsInt(key string, fallback int) int {
strValue := getEnv(key, "")
if value, err := strconv.Atoi(strValue); err == nil {
return value
}
return fallback
}
使用感としては以下
config, err := config.LoadConfig() if err != nil { return nil, fmt.Errorf("could not load config: %w", err) } // データベース接続を作成 db, err := NewDatabaseConnection(DatabaseConfig{ Host: config.Database.Host, Name: config.Database.Name, User: config.Database.User, Password: config.Database.Password, Port: config.Database.Port, })