Pair Programming : ระบบจัดการการตั้งค่าสำหรับ E-commerce API

คุณและคู่หู Pair Programming จะร่วมกันสร้างโปรแกรม Go ง่าย ๆ เพื่อจัดการการตั้งค่าสำหรับเชื่อมต่อฐานข้อมูลของระบบ E-commerce โดยใช้ Environment Variable

โจทย์นี้จะทดสอบความเข้าใจดังต่อไปนี้

  • อ่านค่า Environment Variable ด้วยแพ็กเกจ os
  • ใช้ viper เพื่อจัดการการตั้งค่าที่ซับซ้อนขึ้น
  • ตั้งค่าเริ่มต้น (default values) และจัดการข้อผิดพลาด

ข้อกำหนด

การตั้งค่า

  • โฮสต์ของฐานข้อมูล (MYAPP_DATABASE_HOST)
  • พอร์ตของฐานข้อมูล (MYAPP_DATABASE_PORT)
  • รหัสผ่านของฐานข้อมูล (MYAPP_DATABASE_PASSWORD)

งานที่ต้องทำ

  • คู่หู A เขียนโค้ดเพื่อโหลดการตั้งค่าโดยใช้แพ็กเกจ os พร้อมฟังก์ชัน GetEnv และ GetEnvAsInt
  • คู่หู B เขียนโค้ดเพื่อโหลดการตั้งค่าโดยใช้ viper ด้วย struct และกำหนดค่าเริ่มต้น

ผลลัพธ์

  • โปรแกรมต้องพิมพ์การตั้งค่าทั้งหมด (host, port, password) ออกทางหน้าจอ
  • หาก MYAPP_DATABASE_HOST ไม่ถูกตั้งค่า ให้ใช้ค่าเริ่มต้น "localhost" แทน
  • หาก MYAPP_DATABASE_PORT ไม่ถูกตั้งค่า หรือไม่ใช่ตัวเลข ให้ใช้ค่าเริ่มต้น 5432

ข้อจำกัด

  • ใช้เฉพาะแพ็กเกจ os, fmt, strconv (สำหรับแบบพื้นฐาน) และ viper (สำหรับแบบขั้นสูง) เท่านั้น

โค้ดเริ่มต้น

package main

import (
	"fmt"
	"os"
	"strconv"

	"github.com/spf13/viper"
)

// Config struct สำหรับเก็บการตั้งค่า
type Config struct {
	DatabaseHost     string `mapstructure:"database_host"`
	DatabasePort     int    `mapstructure:"database_port"`
	DatabasePassword string `mapstructure:"database_password"`
}

// ฟังก์ชัน GetEnv (สำหรับคู่หู A)
func GetEnv(key, defaultValue string) string {
	// TODO: คู่หู A เขียนโค้ดที่นี่
	return ""
}

// ฟังก์ชัน GetEnvAsInt (สำหรับคู่หู A)
func GetEnvAsInt(key string, defaultValue int) int {
	// TODO: คู่หู A เขียนโค้ดที่นี่
	return 0
}

// โหลดการตั้งค่าแบบพื้นฐานด้วย os (สำหรับคู่หู A)
func loadBasicConfig() Config {
	// TODO: คู่หู A เขียนโค้ดที่นี่
	return Config{}
}

// โหลดการตั้งค่าแบบใช้ viper (สำหรับคู่หู B)
func loadViperConfig() (Config, error) {
	// TODO: คู่หู B เขียนโค้ดที่นี่
	return Config{}, nil
}

func main() {
	// ทดสอบแบบพื้นฐาน (os)
	fmt.Println("การตั้งค่าแบบพื้นฐาน (os):")
	basicConfig := loadBasicConfig()
	fmt.Printf("Database Host: %s\n", basicConfig.DatabaseHost)
	fmt.Printf("Database Port: %d\n", basicConfig.DatabasePort)
	fmt.Printf("Database Password: %s\n", basicConfig.DatabasePassword)

	// ทดสอบแบบ viper
	fmt.Println("\nการตั้งค่าแบบ Viper:")
	viperConfig, err := loadViperConfig()
	if err != nil {
		fmt.Printf("เกิดข้อผิดพลาด: %v\n", err)
		return
	}
	fmt.Printf("Database Host: %s\n", viperConfig.DatabaseHost)
	fmt.Printf("Database Port: %d\n", viperConfig.DatabasePort)
	fmt.Printf("Database Password: %s\n", viperConfig.DatabasePassword)
}

ตัวอย่างผลลัพธ์

หากตั้งค่า

การตั้งค่าแบบพื้นฐาน (os):
Database Host: myhost.com
Database Port: 5433
Database Password: mypassword

การตั้งค่าแบบ Viper:
Database Host: myhost.com
Database Port: 5433
Database Password: mypassword

หากไม่ตั้งค่า

การตั้งค่าแบบพื้นฐาน (os):
Database Host: localhost
Database Port: 5432
Database Password: 

การตั้งค่าแบบ Viper:
Database Host: localhost
Database Port: 5432
Database Password: