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: