keyboard_tabSkip to content
listGoAPI Essential

การอ่าน ENV

สารบัญ

ENV คืออะไร ?

ENV หรือชื่อเต็มคือ environment variables คือค่าที่ computer แต่ละเครื่องที่เก็บคู่กับสภาพแวดล้อมของตัวเองเอาไว้ ซึ่งจะสามารถใช้งานร่วมกับ process ของ computer ได้ (มองง่ายๆเป็นตัวแปรระดับ process ของ computer)

เช่น

  • TEMP = เตัวแปรสำหรับเก็บ location ของ temporary files
  • HOME = เก็บที่อยู่บ้านของแต่ละเครื่อง

สำหรับ Linux / Mac สามารถลองพิมพ์คำสั่ง env ที่ terminal เพื่อดูค่าได้

bash
env

env-01

ซึ่งแน่นอน ภาษา Go นั้นเมื่อมีการ run ขึ้นมา = จะเกิดเป็น process บนเครื่อง เท่ากับว่าก็จะสามารถเข้าถึงตัวแปรของ environment ได้เช่นกัน

โดยปกติ มีวิธีใช้งานอยู่ด้วยกัน 2 วิธีคือ

  1. อ่านจาก env เครื่องโดยตรง (อ่านจากค่า env ที่เราพิมพ์ไปเมื่อกี้)
  2. อ่านจาก env file (ไม่อ่านจากเครื่องโดยตรง แต่อ่านจากไฟล์ environment ที่เตรียมไว้แทน)

วิธีที่ 1 env เครื่อง

main.go

go
package main

import (
  "os"
  "github.com/gofiber/fiber/v2"
)

func getEnv(key, fallback string) string {
  if value, exists := os.LookupEnv(key); exists {
    return value
  }
  return fallback
}

func main() {
  app := fiber.New()

  // Setup routes
  app.Get("/api/config", getConfig)

  // Use the environment variable for the port, default to 8080 if not set
  port := getEnv("PORT", "8080")

  app.Listen(":" + port)
}

func getConfig(c *fiber.Ctx) error {
  // Example: Return a configuration value from environment variable
  secretKey := getEnv("SECRET_KEY", "defaultSecret")

  return c.JSON(fiber.Map{
    "secret_key": secretKey,
  })
}

คำสั่ง run

bash
export SECRET_KEY=123 # ทำการเพิ่มตัวแปร environment เข้ามาใหม่

go run main.go

ผลลัพธ์ก็จะสามารถดึงค่า environment ออกมาได้

env-02

วิธีที่ 2 env file

Ref: https://pkg.go.dev/github.com/joho/godotenv

ให้เพิ่ม library สำหรับการอ่านผ่าน .env file เข้าไป

bash
go get github.com/joho/godotenv
  • library นี้จะสามารถอ่านค่าจาก .env เข้ามาได้เลยผ่านคำสั่ง godotenv.Load() ออกมาได้
  • ที่ .env file ลองทดสอบเพิ่มค่าเป็น
PORT=8080
SECRET_KEY=mysecretkey
  • ที่ main.go ลองเปลี่ยนมาเรียกโดยใช้ library godotenv แทน
go
package main

import (
  "github.com/gofiber/fiber/v2"
  "github.com/joho/godotenv"
  "log"
  "os"
)

func main() {
  // Load environment variables from .env file
  err := godotenv.Load()
  if err != nil {
    log.Fatal("Error loading .env file")
  }

  app := fiber.New()

  // Setup routes
  app.Get("/api/config", getConfig)

  // Use the environment variable for the port
  port := os.Getenv("PORT")
  if port == "" {
    port = "8080" // Default port if not specified
  }

  app.Listen(":" + port)
}

func getConfig(c *fiber.Ctx) error {
  // Example: Return a configuration value from environment variable
  secretKey := os.Getenv("SECRET_KEY")
  if secretKey == "" {
    secretKey = "defaultSecret" // Default value if not specified
  }

  return c.JSON(fiber.Map{
    "secret_key": secretKey,
  })
}

ผลลัพธ์ก็จะสามารถดึงค่า environment ออกมาได้เช่นกัน

env-03