การอ่าน ENV
ENV คืออะไร ?
ENV หรือชื่อเต็มคือ environment variables คือค่าที่ computer แต่ละเครื ่องที่เก็บคู่กับสภาพแวดล้อมของตัวเองเอาไว้ ซึ่งจะสามารถใช้งานร่วมกับ process ของ computer ได้ (มองง่ายๆเป็นตัวแปรระดับ process ของ computer)
เช่น
- TEMP = เตัวแปรสำหรับเก็บ location ของ temporary files
- HOME = เก็บที่อยู่บ้านของแต่ละเครื่อง
สำหรับ Linux / Mac สามารถลองพิมพ์คำสั่ง env
ที่ terminal เพื่อดูค่าได้
env
ซึ่งแน่นอน ภาษา Go นั้นเมื่อมีการ run ขึ้นมา = จะเกิดเป็น process บนเครื่อง เท่ากับว่าก็จะสามารถเข้าถึงตัวแปรของ environment ได้เช่นกัน
โดยปกติ มีวิธีใช้งานอยู่ด้วยกัน 2 วิธีคือ
- อ่านจาก env เครื่องโดยตรง (อ่านจากค่า env ที่เราพิมพ์ไปเมื่อกี้)
- อ่านจาก env file (ไม่อ่านจากเครื่องโดยตรง แต่อ่านจากไฟล์ environment ที่เตรียมไว้แทน)
วิธีที่ 1 env เครื่อง
main.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
export SECRET_KEY=123 # ทำการเพิ่มตัวแปร environment เข้ามาใหม่
go run main.go
ผลลัพธ์ก็จะสามารถดึงค่า environment ออกมาได้
วิธีที่ 2 env file
Ref: https://pkg.go.dev/github.com/joho/godotenv
ให้เพิ่ม library สำหรับการอ่านผ่าน .env file เข้าไป
go get github.com/joho/godotenv
- library นี้จะสามารถอ่านค่าจาก
.env
เข้ามาได้เลยผ่านคำสั่งgodotenv.Load()
ออกมาได้ - ที่ .env file ลองทดสอบเพิ่มค่าเป็น
PORT=8080
SECRET_KEY=mysecretkey
- ที่ main.go ลองเปลี่ยนมาเรียกโดยใช้ library godotenv แทน
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 ออกมาได้เช่นกัน